IP地址左移表示

时间:2012-04-28 12:22:26

标签: c ipv4

我在一些陈旧的和坏的C代码中发现了以下内容:

#define addr (((((147 << 8) | 87) << 8) | 117) << 8) | 107

这是什么?嗯,我知道它是一个IP地址 - 向左移8位也是有道理的。但任何人都可以向我解释这个问题吗?那里发生了什么?

谢谢!

2 个答案:

答案 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位。