在网络编程里,网络字节序是big-endian的,而大部分的PC的系统都是X86处理器系列,X86采用的是little-endian,所以需要将
网络数据流转换成本地数据流的话,需要进行字节序的转换。
标准库里提供了hlton()和nthl()两个函数来支持转换。
hston(unsigned short), hlton(unsigned long) 将本地字节序转换为网络字节序
ntohl(unsigned long), ntohs(unsigned short) 将网络字节序转换为本地字节序
但是对于64位的整数进行转换,标准库并没有提供相应的转换函数,本文将给出个人原创的64位字节序转换函数。
#ifndef ULONG64
#define unsigned long long ULONG64
#endif
// host long 64 to network
ULONG64 hl64ton(ULONG64 host)
{
ULONG64 ret = 0;
ULONG high,low;
low = host & 0xFFFFFFFF;
high = (host >> 32) & 0xFFFFFFFF;
low = htonl(low);
high = htonl(high);
ret = low;
ret <<= 32;
ret |= high;
return ret;
}
//network to host long 64
ULONG64 ntohl64(ULONG64 host)
{
ULONG64 ret = 0;
ULONG high,low;
low = host & 0xFFFFFFFF;
high = (host >> 32) & 0xFFFFFFFF;
low = ntohl(low);
high = ntohl(high);
ret = low;
ret <<= 32;
ret |= high;
return ret;
}
关于little endian和big endian的详细信息,网上的资料太多了,本文就不详述了。