集册 Java实例教程 文本到数字格式IPv4

文本到数字格式IPv4

欢马劈雪     最近更新时间:2020-01-02 10:19:05

503
提示:您可在线编辑运行本教程的实例 - 运行实例,去试试!
文本到数字格式IPv4
//来自 N o  w  J a v a . c o m - 时  代  Java

/*

 * Copyright (c) 2004, 2015, Oracle and/or its affiliates. All rights reserved.

 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.

 *

 * This code is free software; you can redistribute it and/or modify it

 * under the terms of the GNU General Public License version 2 only, as

 * published by the Free Software Foundation.  Oracle designates this

 * particular file as subject to the "Classpath" exception as provided

 * by Oracle in the LICENSE file that accompanied this code.

 *

 * This code is distributed in the hope that it will be useful, but WITHOUT

 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or

 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License

 * version 2 for more details (a copy is included in the LICENSE file that

 * accompanied this code).

 *

 * You should have received a copy of the GNU General Public License version

 * 2 along with this work; if not, write to the Free Software Foundation,

 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.

 *

 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA

 * or visit www.oracle.com if you need additional information or have any

 * questions.

 */

//package com.nowjava;


public class Main {

    public static void main(String[] argv) throws Exception {

        String src = "nowjava.com";

        System.out.println(java.util.Arrays

                .toString(textToNumericFormatV4(src)));

    }


    private static final int INADDR4SZ = 4;


    @SuppressWarnings("fallthrough")

    public static byte[] textToNumericFormatV4(String src) {

        byte[] res = new byte[INADDR4SZ];


        long tmpValue = 0;

        int currByte = 0;

        boolean newOctet = true;/* 来 自 nowjava.com - 时  代  Java*/


        int len = src.length();

        if (len == 0 || len > 15) {

            return null;

        }

        /*

         * When only one part is given, the value is stored directly in

         * the network address without any byte rearrangement.

         *

         * When a two part address is supplied, the last part is

         * interpreted as a 24-bit quantity and placed in the right

         * most three bytes of the network address. This makes the

         * two part address format convenient for specifying Class A

         * network addresses as net.host.

         *

         * When a three part address is specified, the last part is

         * interpreted as a 16-bit quantity and placed in the right

         * most two bytes of the network address. This makes the

         * three part address format convenient for specifying

         * Class B net- work addresses as 128.net.host.

         *

         * When four parts are specified, each is interpreted as a

         * byte of data and assigned, from left to right, to the

         * four bytes of an IPv4 address.

         *

         * We determine and parse the leading parts, if any, as single

         * byte values in one pass directly into the resulting byte[],

         * then the remainder is treated as a 8-to-32-bit entity and

         * translated into the remaining bytes in the array.

         */

        for (int i = 0; i < len; i++) {

            char c = src.charAt(i);

            if (c == '.') {

                if (newOctet || tmpValue < 0 || tmpValue > 0xff

                        || currByte == 3) {

                    return null;

                }

                res[currByte++] = (byte) (tmpValue & 0xff);

                tmpValue = 0;

                newOctet = true;

            } else {

                int digit = Character.digit(c, 10);

                if (digit < 0) {

                    return null;

                }

                tmpValue *= 10;

                tmpValue += digit;

                newOctet = false;
展开阅读全文