Converting IPv4 to IPv6 and backMarch 19, 2009
Converting from IPv4 to IPv6
is so easy, yet everyone seem to convert a IPv4 address to binary, then to IPv6. Why? Why waste time and do things the long way? Not cool.
When would you need to do this? One specific use is IPv6 6-to-4 tunnels, which always concatenates 2002::/16 with the IPv4 address embedded.
With Automatic 6-to-4-tunnels, your address format is as follow:
2002:<32 bit IPv4 site address in Hex>:<16 bit network number in Hex>::/64
The question is how to do the conversion.
Firstly before starting I will assume everyone knows the following:
- Binary is a Base-2 numbering system, as it has only 0,1
- Decimal is a Base-10 numbering system, as it has 0,1,2,3,4,5,6,7,8,9
- Hexadecimal is a Base-16 numbering system, as it has 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
I also assume you know the hex values in decimal:
Two more things I would like to mention before explaining the conversion.
An IPv4 address : example 192.168.99.1
- Each Octet (8 bits) “between the dot-thingys” denote 1 byte
An IPv6 address : example 2001:0db8:85a3:0000:0000:8a2e:0370:7334
- Two Tuples (1 Tuple = 4 bits = 1 Hex character) denotes 1 byte
Then converting is easy. Lets take the following IPv4 address : 192.168.99.1 and convert it to Hex.
Divide the first octet (192) by 16 (since Hex is a Base-16)
IE : 192/16 = 12 times exactly with 0 left over
- 12 in Hex is represented as C
- 0 (zero) in Hex is, you guessed it, 0
Thus 192 in HEX is C0
Repeat step 1 with the second octet (168),
IE : 168/16 = 10 times with 8 left over because 10*6 = 160,
- 10 in HEX is A
- 8 in HEX is 8
Thus 168 in HEX is A8
Repetition rules!!! Third octet (99)
IE : 99/16 = 6 times with 3 left over
- 6 in HEX is 6
- 3 in HEX is 3
Thus 99 in HEX is 63
IE : 1/16 = 0 times with 1 left over
- 0 in HEX is, yeah it is 0
- 1 in HEX is 1
Thus 1 in HEX is 01
So the IPv4 address of 192.168.99.1, represented in the IPv6 address portion would be C0A8:6301.
So when using IPv6 6-to-4 Tunnels, on the one endpoint of the tunnel, with the IPv4 address of 192.168.99.1, the complete IPv6 address would be 2002:C0A8:6301::1/64
See, not all that difficult, if you know your 16 multiplication table, you can do this in your head, no problems.
- – - -
Converting back from IPv6 to IPv4
Now to convert the same portion of the IPv6address 2002:C0A8:6301::1/64 back to IPv4, the reverse method would apply.
Let me point one more thing about Base-16 out to understand why I’m doing what I am below:
160 = 1
161 = 16
Taking the portion C0A8:6301, first divide the address into 2 Tuple-groupings (2 Hex Characters) = C0 A8 63 01
Take C0 and multiply the first character ‘C’ by 16 and the second character ’0′ by 1.
Add the two decimal values together to get the IPv4 decimal value
IE: ((C=12)*16) + (0*1) = 192
Repeat the same process with A8,
IE: ((A=10)*16) + (8*1) = 168
Repeat the same process with 63,
IE: (6*16) + (3*1) = 99
Repeat the same process with 01,
IE: (0*16) + (1*1) = 1
This will give you an IPv4 address of 192.168.99.1