将 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&lt;unsigned int*&gt;() 进行 c++ 强制转换,但只要你有相同的字节序就应该是可移植的 我按照您的建议进行了编辑。但我的主要意图是,它是不是使用位移运算符的首选转换方法。 @Theolodis 它不可移植,如果 char 数组不适合对齐,则有平台无法处理。 intall 平台上的 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 地址字节转换为整数的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中将整数转换为 2 字节的十六进制值

主机字节序和网络字节序转换

在Python中将IP地址字符串转换为二进制

如何将Mac地址转换为十六进制并将其传递给java中的字节数组

将ip转换为二进制

将 2 个字节转换为整数