首先我们要对于网络字节序和主机字节序有一个初步的概念。
字节序:字节在内存中储存的顺序
字节序的种类:(1):大端字节序,数值高位储存在内存的低地址,低位储存在内存的高地址,在 两个电脑之间传输时候用的
(2):小端字节序,数值低位储存在内存的低地址,高位储存在内存的高地址,在 自己电脑上传输东西用的
主机字节序:CPU存储数据时采用的字节顺序,不同CPU采用的字节序是不同的。
网络字节序:使用的统一字节顺序,避免兼容问题。
关于两者的相互转换,我们将在Linux里面进行
我们经常会使用以下四个C标准库函数进行字节的转换:
#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong); //把uint32_t类型从主机序转换到网络序
uint16_t htons(uint16_t hostshort); //把uint16_t类型从主机序转换到网络序
uint32_t ntohl(uint32_t netlong); //把uint32_t类型从网络序转换到主机序
uint16_t ntohs(uint16_t netshort); //把uint16_t类型从网络序转换到主机序
借鉴的两者转换代码:
//主机序转网络序
unsigned long long htonll(unsigned long long val)
{
if(__BYTE_ORDER == __LITTLE_ENDIAN)
{
return (((unsigned long long )htonl((int)((val << 32) >> 32))) << 32) | (unsigned int)htonl((int)(val >> 32));
}
else if (__BYTE_ORDER == __BIG_ENDIAN)
{
return val;
}
}
//网络序转主机序
unsigned long long ntohll(unsigned long long val)
{
if (__BYTE_ORDER == __LITTLE_ENDIAN)
{
return (((unsigned long long )ntohl((int)((val << 32) >> 32))) << 32) | (unsigned int)ntohl((int)(val >> 32));
}
else if (__BYTE_ORDER == __BIG_ENDIAN)
{
return val;
}
}
标签:__,字节,主机,unsigned,long,uint16,函数 From: https://www.cnblogs.com/HuangCB/p/16750361.html