在windows 8.1 以后的版本直接就能用htonll和ntohll进行相互转换。其实此方法已实现,只是在windows 8.0及以下版本中并未开放,这里是微软件的实现方式(还有其它实现方式),经测试可用,这里将它摘出来,如下所示:
#define _WS2_32_WINSOCK_SWAP_LONG(l) \
( ( ((l) >> 24) & 0x000000FFL ) | \
( ((l) >> 8) & 0x0000FF00L ) | \
( ((l) << 8) & 0x00FF0000L ) | \
( ((l) << 24) & 0xFF000000L ) )
#define _WS2_32_WINSOCK_SWAP_LONGLONG(l) \
( ( ((l) >> 56) & 0x00000000000000FFLL ) | \
( ((l) >> 40) & 0x000000000000FF00LL ) | \
( ((l) >> 24) & 0x0000000000FF0000LL ) | \
( ((l) >> 8) & 0x00000000FF000000LL ) | \
( ((l) << 8) & 0x000000FF00000000LL ) | \
( ((l) << 24) & 0x0000FF0000000000LL ) | \
( ((l) << 40) & 0x00FF000000000000LL ) | \
( ((l) << 56) & 0xFF00000000000000LL ) )
#ifndef htonll
__inline unsigned __int64 LIBAPI htonll ( unsigned __int64 Value )
{
const unsigned __int64 Retval = _WS2_32_WINSOCK_SWAP_LONGLONG (Value);
return Retval;
}
#endif /* htonll */
#ifndef ntohll
__inline unsigned __int64 LIBAPI ntohll ( unsigned __int64 Value )
{
const unsigned __int64 Retval = _WS2_32_WINSOCK_SWAP_LONGLONG (Value);
return Retval;
}
#endif /* ntohll */
另外,如果是C#的话,使用IPAddress.HostToNetworkOrder方法直接就能转。

本文介绍在Windows 8.1及以上版本如何使用 htonll 和 ntohll 进行长整型网络字节序转换。对于较早版本的Windows,提供了手动实现这两种功能的方法,并展示了相应的C语言代码示例。同时,对于C#开发者,推荐使用 IPAddress.HostToNetworkOrder 方法。

被折叠的 条评论
为什么被折叠?



