我在一些陈旧的和坏的C代码中发现了以下内容:
#define addr (((((147 << 8) | 87) << 8) | 117) << 8) | 107
这是什么?嗯,我知道它是一个IP地址 - 向左移8位也是有道理的。但任何人都可以向我解释这个问题吗?那里发生了什么?
谢谢!
答案 0 :(得分:10)
代码
(((((147 << 8) | 87) << 8) | 117) << 8) | 107
生成包含IP 147.87.117.107的4个字节。 第一步是最里面的括号:
147<<8
147 = 1001 0011
1001 0011 << 8 = 1001 0011 0000 0000
通过按位或操作(147 <&lt; 8)插入第二字节87。如您所见,右侧的8位全部为0(由于&lt;&lt; 8),因此按位或操作只是插入87位的8位:
1001 0011 0000 0000 (147<<8)
0000 0000 0101 0111 (87)
------------------- bitwise-or
1001 0011 0101 0111 (147<<8)|87
使用rest也是如此,所以最后将4个字节保存到一个32位整数中。
答案 1 :(得分:3)
IPv4地址由四个字节组成,这意味着它可以存储在32位整数中。这是取IP地址的四个部分(147.87.117.107),并使用位移和按位OR运算符以单个4字节数量“编码”地址。
(注意:地址可能是107.117.87.147 - 我不记得该字节存储的顺序。)
结果数量的(十六进制)字节如下所示:
aabb ccdd
其中aa是十六进制表示147(0x93),bb是87(0x57),cc是117(0x75),dd是107(0x6b),因此得到的值是9357756b。
更新:这些都不适用于IPv6,因为IPv6地址是128位而不是32位。