我从MSDN找到了以下函数,它以主机字节顺序将unsigned long
从网络字节转换为unsigned long
,即以little-endian定义为:
u_long WSAAPI ntohl(
_In_ u_long netlong
);
MSDN文档说它可以转换32位数字。但是因为我在C ++中已经知道long
和int
不相同,所以long
不能保证是32位或整数INT_MAX
的相同大小。
所以,我想知道是否有类似的函数需要32位值,例如unsigned int
而不是unsigned long
?
答案 0 :(得分:1)
documentation明确指出ntohl
的{{1}}参数是32位值:
TCP / IP网络字节顺序中的32位数字。
我读过long和int不一样,即long不是 保证为32位或整数INT_MAX的相同大小。
你是对的 - 在标准C ++ 中,netlong
not guaranteed是is 32-bits的任何特定大小,除了它必须至少 32位。
然而,由于我们讨论的是endian转换函数,我们在这里讨论特定于平台的细节。我们现在需要深入了解Windows 下long
的内容。在Windows下,有一个很长的{{3}}:
32位有符号整数。范围是-2147483648到2147483647 小数。此类型在WinNT.h中声明如下:
long
答案 1 :(得分:0)
ntohl()
和htonl()
始终在所有平台上运行32位值。这是BSD标准的一部分。在(u_)long
大于32位的平台上,将使用不同的32位数据类型。例如,某些平台(包括Linux和FreeBSD)使用uint32_t
来避免(u_)long
大小的任何问题。