3

私はいくつかの古くて悪い文書化されたCコードで以下を見つけました:

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

それは何ですか?私はそれがIPアドレスであることを知っています-そして8ビットを左にシフトすることもある程度意味があります。しかし、誰かが私にこれを全体として説明できますか?そこで何が起こっているのですか?

ありがとうございました!

4

2 に答える 2

11

コード

(((((147 << 8) | 87) << 8) | 117) << 8) | 107

IP147.87.117.107を含む4バイトを生成します。最初のステップは、最も内側のブラケットです。

147<<8
147 = 1001 0011
1001 0011 << 8 = 1001 0011 0000 0000

2番目のバイト87は、ビット単位または(147 << 8)の演算によって挿入されます。ご覧のとおり、右側の8ビットはすべて0(<< 8のため)であるため、ビット単位の演算では、87から8ビットが挿入されます。

1001 0011 0000 0000  (147<<8)
0000 0000 0101 0111  (87)
-------------------  bitwise-or
1001 0011 0101 0111  (147<<8)|87

同じことが残りの部分でも行われるため、最後に4バイトが単一の32ビット整数に保存されます。

于 2012-04-28T12:36:57.413 に答える
3

IPv4アドレスは4バイトで構成されているため、32ビット整数で格納できます。これは、IPアドレスの4つの部分(147.87.117.107)を取得し、ビットシフトとビット単位のOR演算子を使用して、アドレスを単一の4バイト量で「エンコード」します。

(注:アドレスは107.117.87.147である可能性があります-バイトがどの順序で格納されているかをすぐに思い出せません。)

結果の数量の(16進)バイトは次のようになります。

aabb ccdd

ここで、aaは147(0x93)の16進表現、bbは87(0x57)、ccは117(0x75)、ddは107(0x6b)であるため、結果の値は9357756bになります。

更新: IPv6アドレスは32ビットではなく128ビットであるため、これはIPv6には適用されません。

于 2012-04-28T12:33:54.160 に答える