将 IP 地址字节转换为整数
Posted
技术标签:
【中文标题】将 IP 地址字节转换为整数【英文标题】:Converting IP Address bytes to integer 【发布时间】:2014-04-23 07:13:53 【问题描述】:例如:
1.转换 32 位 IP 地址 (IPv4):
unsigned char ByteAddress[4]; unsigned int* IntegerAddress; IntegerAddress = reinterpret_cast<unsigned int*> &ByteAddress ;
然后我可以使用 IntegerAddress 来比较 ip 地址。
2。转换 128 位 IP 地址 (IPv6):
unsigned char ByteAddress[16]; uint64_t* LongAddress; LongAddress = reinterpret_cast<uint64_t*> &ByteAddress
然后我可以使用 LongAddress[0] 和 LongAddress[1] 来比较 ip 地址。
它是否优于使用位移运算符(因为它更快)? 这是良好的编程习惯吗?它是否适用于所有平台(尤其是 unix 和 windows 64)和编译器(C++、VS2010)
【问题讨论】:
我更喜欢在 c++ 代码中使用reinterpret_cast<unsigned int*>()
进行 c++ 强制转换,但只要你有相同的字节序就应该是可移植的
我按照您的建议进行了编辑。但我的主要意图是,它是不是使用位移运算符的首选转换方法。
@Theolodis 它不可移植,如果 char 数组不适合对齐,则有平台无法处理。
int
与 all 平台上的 char[4]
大小不同。示例:在 16 位 Windows 程序中,int
是 16 位。不过,它可以在许多平台上运行。
您应该知道,通过网络传输的 IP 地址(以及在套接字结构中使用的)是网络(又名大端)字节顺序。您可能需要使用ntohl() 函数来为您的机器架构获取正确的整数表示。
【参考方案1】:
我认为,您可以为此使用联合
union Int32And4Bytes
int32_t IntegerValue;
unsigned char ByteArray[4];
;
它应该正确对齐,IIRC。
【讨论】:
我最初就想到了这一点,但是对于使用联合来重新解释数据存在很多困惑。许多人说结果将是不可预测的,这取决于编译器和平台。例如:***.com/questions/2310483/… 最正确的方法是使用移位操作。但是你应该检测字节序。 移位操作符不管字节序都可以工作:***.com/questions/1041554/… 由于类型双关语,这在 C++ 中不起作用。它违反了标准(仅在 C 中有效)。它可能适用于某些编译器,但您不应该依赖它。以上是关于将 IP 地址字节转换为整数的主要内容,如果未能解决你的问题,请参考以下文章