0. 介绍
大小端计算机存储数据而安排字节的两种顺序。
针对的是字节。
大端与我们平时书写的顺序一致。
1. 大小端的判定
不需要手动判断。
有一个头文件endian.h;
可能会有宏
__BYTE_ORDER
__BIG_ENDIAN
__LITTLE_ENDIAN
通过库来进行判断。
- 手动判断
根据字节存取的顺序进行判断
int getEndian(void){
unsigned short val = 0001;
unsigned char *p = (unsigned char *) (&val);
int end = BIG_ENDIAN;
if(p[0] == 1){
end = LITTLE_ENDIAN;
}
return end;
}
2. 网络字节序转换
使用函数ntohs()
ntohl()
htons()
htonl()
即可。
3. 提取整形中的第几字节数据
static __always_inline unsigned char
extractbyte (op_t x, unsigned int idx)
{
if (__BYTE_ORDER == __LITTLE_ENDIAN)
return x >> (idx * CHAR_BIT);
else
return x >> (sizeof (x) - 1 - idx) * CHAR_BIT;
}
4. 重复几字节的数据
static __always_inline op_t
repeat_bytes (unsigned char c_in)
{
return ((op_t)-1 / 0xff) * c_in;
}