javaiptype-conversionipv6long-integer

Conversion IPv6 to long and long to IPv6


How should I perform conversion from IPv6 to long and vice versa?

So far I have:

    public static long IPToLong(String addr) {
            String[] addrArray = addr.split("\\.");
            long num = 0;
            for (int i = 0; i < addrArray.length; i++) {
                    int power = 3 - i;

                    num += ((Integer.parseInt(addrArray[i], 16) % 256 * Math.pow(256, power)));
            }
            return num;
    }

    public static String longToIP(long ip) {
            return ((ip >> 24) & 0xFF) + "."
                    + ((ip >> 16) & 0xFF) + "."
                    + ((ip >> 8) & 0xFF) + "."
                    + (ip & 0xFF);

    }

Is it correct solution or I missed something?

(It would be perfect if the solution worked for both ipv4 and ipv6)


Solution

  • An IPv6 address is a 128-bit number as described here. A long in Java is represented on 64 bits, so you need another structure, like a BigDecimal or two longs (a container with an array of two longs or simply an array of two longs) in order to store an IPv6 address.

    Below is an example (just to provide you an idea):

    public class Asd {
    
        public static long[] IPToLong(String addr) {
            String[] addrArray = addr.split(":");//a IPv6 adress is of form 2607:f0d0:1002:0051:0000:0000:0000:0004
            long[] num = new long[addrArray.length];
            
            for (int i=0; i<addrArray.length; i++) {
                num[i] = Long.parseLong(addrArray[i], 16);
            }
            long long1 = num[0];
            for (int i=1;i<4;i++) {
                long1 = (long1<<16) + num[i];
            }
            long long2 = num[4];
            for (int i=5;i<8;i++) {
                long2 = (long2<<16) + num[i];
            }
            
            long[] longs = {long2, long1};
            return longs;
        }
        
        
        public static String longToIP(long[] ip) {
            String ipString = "";
            for (long crtLong : ip) {//for every long: it should be two of them
    
                for (int i=0; i<4; i++) {//we display in total 4 parts for every long
                    ipString = Long.toHexString(crtLong & 0xFFFF) + ":" + ipString;
                    crtLong = crtLong >> 16;
                }
            }
            return ipString;
        
        }
        
        static public void main(String[] args) {
            String ipString = "2607:f0d0:1002:0051:0000:0000:0000:0004";
            long[] asd = IPToLong(ipString);
            
            System.out.println(longToIP(asd));
        }
    }