Convert string representing hex number to ipv6

852 Views Asked by At

I have this string representing hex:

00000000ff00ff00000900000600020a

I'm trying to convert it to IPv6 with net package

the result I'm expecting is(big endian):

20a:600::9:ff00:ff00::

I tried this:

    ip := "00000000ff00ff00000900000600020a"
    res := make(net.IP, net.IPv6len)
    var err error
    res,err = hex.DecodeString(ip)
    if err != nil {
        fmt.Println("error")
    }
    for i := 0; i < 16/2; i++ {
        res[i], res[16-1-i] = res[16-1-i], res[i]
    }
    fmt.Println(res.String())

but I'm getting this:

a02:6:0:900:ff:ff::

Thanks!

2

There are 2 best solutions below

2
On BEST ANSWER

Try this:

for i := 0; i < 16/2; i += 2 {
    res[i], res[16-2-i] = res[16-2-i], res[i]
    res[i+1], res[16-1-i] = res[16-1-i], res[i+1]
}

bytes goes in pair, so you need to flip both at time

0
On

Your question is not clear what is being reversed, when you compare. Typically, when switching endianness, you reverse the bytes, but that is not what you seem to want here.

In any case, here is code to reverse in many different ways, using the IPAddress Go library. Disclaimer: I am the project manager.

str := "00000000ff00ff00000900000600020a"
ipAddr := ipaddr.NewIPAddressString(str).GetAddress()
reversedAddr, _ := ipAddr.ReverseBytes()
reverseEachSegment := ipAddr.ReverseSegments()
reverseBitsEachByte, _ := ipAddr.ReverseBits(true)
reverseBits, _ := ipAddr.ReverseBits(false)
fmt.Println("original", ipAddr)
fmt.Println("bytes reversed", reversedAddr)
fmt.Println("bytes reversed in each segment", reverseEachSegment)
fmt.Println("bits reversed in each byte", reverseBitsEachByte)
fmt.Println("bits reversed", reverseBits)

Output:

original ::ff00:ff00:9:0:600:20a
bytes reversed a02:6:0:900:ff:ff::
bytes reversed in each segment 20a:600:0:9:ff00:ff00::
bits reversed in each byte ::ff00:ff00:90:0:6000:4050
bits reversed 5040:60:0:9000:ff:ff::

For some reason it is reversing the bytes in each segment that gets you what you expect, although that is not switching endianness.