主机字节序采用了:小端模式‘低对低,高对高’
网络
字节序采用了:大端模式‘低对高,高对低’
16位/32位头文件netinet/in.h自带函数:
主机字节序转换网络字节序
uint16_t htons(uint16_t host16bit)
uint32_t htonl(uint32_t host16bit)
网络字节序转换主机字节序
uint16_t ntohs(uint16_t net16bit)
uint32_t ntohl(uint32_t net16bit)
float 网络字节序与主机字节序转换
#define SWAP(x,y) {BYTE tmp; tmp=x;x=y;y=tmp;}
float ntohf(float *host_float)
{
BYTE arrfloat[4];
memcpy(arrfloat,host_float,4);
SWAP(arrfloat[0],arrfloat[3]);
SWAP(arrfloat[1],arrfloat[2]);
return *(float*)arrfloat;
}
64位
网络字节序与主机字节序转换
uint64_t htohll(uint64_t mask)
{
if(_BYTE_ORDER==_LITTLE_ENDIAN)
return (((uint64_t)htonl((uint32_t)((mask<<32)>>32)))<<32)|(uint32_t)htonl((uint32_t)(mask>>32));
else if(_BYTE_ORDER==_BIG_ENDIAN)
return mask;
}
{
if(_BYTE_ORDER==_LITTLE_ENDIAN)
return (((uint64_t)htonl((uint32_t)((mask<<32)>>32)))<<32)|(uint32_t)htonl((uint32_t)(mask>>32));
else if(_BYTE_ORDER==_BIG_ENDIAN)
return mask;
}
uint8_t数组
网络字节序与主机字节序转换
uint8_t *ntoh_arr(uint8_t *arr)
{
uint32_t len = strlen(arr);
uint32_t i=0;
uint8_t array[len];
for(len--;len>=0;len--)
{
array[i]=arr[len];
i++;
}
return array;
}