Truman Boyes零与一

存档 · IPv6

如何把十进制转换成二进制和十六进制

作者:Truman Boyes · · 2 分钟阅读

我本来想在开始讨论十进制、二进制和十六进制之间的转换方法后再写这篇文章;既然我和 Phil 今天聊到了这个,我觉得这些信息可能对那些处理 IP、子网划分,甚至想弄懂 IPv6 地址的人有帮助。我只会用稍微数学一点的方式来解释,并把重点放在完全实用或更直观的思路上。

假设你有 IP 地址 192.168.20.1,需要把它转换成二进制。该怎么做?首先,你得明白点分十进制表示的每一段都是一个字节,也就是 8 位。其次,要记住每一位都有一个固定的数值,可能是开(1)也可能是关(0)。

最左边的位是最高位(数值最大),我们可以把位的数值想成:128、64、32、16、8、4、2、1。在这八个位上不同的组合可以产生最高 255 的数值。如果要把 IP 地址 192.168.20.1 表示出来,我们可以逐位处理来简化任务。

192 = 11000000

168 = 10101000

20 = 00010100

1 = 00000001

于是整个 IP 的二进制形式可以写成:11000000.10101000.00010100.00000001

接下来你可能想转成十六进制,这非常容易,和我们刚才转换成二进制的思路类似。不过十六进制是基数为 16 的系统,数值是:0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。可以把它们映射为 A=10、B=11、…、F=15。

如果要把第一个八位字节(数值 192)转换成十六进制,你可以这么做:取二进制 ‘11000000’ 并把它均等分成两段 4 位,例如 1100 和 0000。现在可以像转换十进制时那样给每一位赋值。对 ‘0000’ 可以直接确定数值为 ‘0’。对 ‘1100’,最高位值为 ‘8’,第二位值为 ‘4’,把它们相加得到 ‘12’,而十六进制中十进制 12 对应 ‘C’。

于是得到 ‘C’ 和 ‘0’,可以写成 ‘0xC0’。这个值等同于十进制的 192。

现在来点稍微难点的内容。我们取一个在我的网络中恰好存在的 IPV6 地址:2001:470:8859:beef:21f:f3ff:fed2:d571。假设我正在做的某个应用程序需要把网络部分 ‘2001:470:8859:beef’ 转换成二进制表示。下面是我的做法:

2001 = 20 01

20 = 00100000

01 = 00000001

04  = 00000100

70 =  01110000

88 =  10001000

59 =  01011001

BE  =  10111110

EF  =  11101111

把这些全部拼在一起就得到:
0010000000000001:0000010001110000:1000100001110000:1000100001011001:101111101110111

轻而易举。


最初发表于 truman.net。查看归档副本。