将网络字节顺序(大端)转换为小端

时间:2014-01-15 17:11:28

标签: c++ windows sockets winsock endianness

我从MSDN找到了以下函数,它以主机字节顺序将unsigned long从网络字节转换为unsigned long,即以little-endian定义为:

u_long WSAAPI ntohl(
       _In_  u_long netlong
);

MSDN文档说它可以转换32位数字。但是因为我在C ++中已经知道longint不相同,所以long不能保证是32位或整数INT_MAX的相同大小。

所以,我想知道是否有类似的函数需要32位值,例如unsigned int而不是unsigned long

2 个答案:

答案 0 :(得分:1)

documentation明确指出ntohl的{​​{1}}参数是32位值:

netlong [in]

  

TCP / IP网络字节顺序中的32位数字。


  

我读过long和int不一样,即long不是   保证为32位或整数INT_MAX的相同大小。

你是对的 - 在标准C ++ 中,netlong not guaranteedis 32-bits的任何特定大小,除了它必须至少 32位。

然而,由于我们讨论的是endian转换函数,我们在这里讨论特定于平台的细节。我们现在需要深入了解Windows 下long 的内容。在Windows下,有一个很长的{{3}}:

LONG

  

32位有符号整数。范围是-2147483648到2147483647   小数。此类型在WinNT.h中声明如下:

long

答案 1 :(得分:0)

ntohl()htonl()始终在所有平台上运行32位值。这是BSD标准的一部分。在(u_)long大于32位的平台上,将使用不同的32位数据类型。例如,某些平台(包括Linux和FreeBSD)使用uint32_t来避免(u_)long大小的任何问题。