什么是大端小端
大小端模式就是存储数据时,数据的高低位是怎么存储在地址的高低位上。
大端模式(Most Significant Byte,MSB):数据的高位,存放在地址的低位,即高位存低位,低位存高位。
小端模式(Least Significant Byte,LSB):数据的高位,存放在地址的高位,即高位存高位,低位存低位。
明显小端模式更符合我们日常记录书写的习惯,pc机一般都是小端模式。
当我们使用的pc机和待读取数据大小端不一致时候,要特别注意,要使用相应的方式进行读取数据,具体方式看下文。
//联合体判断
#include<stdio.h>
union var{
int i;
char j;
}data;
int main(){
data.i = 1;
if(j == 1)
{
printf("pc is 小端\n");
}
else
{
printf("pc is 大端\n");
}
}
//大小端转换
//网络字节序通常是打断,x86pc通常是小段
//如何实现大小端的数据转换。
htons(port);//端口通常为uint16
std:string IP;
inet_addr(IP.c_str());//将点分十进制转换为uint32,再调换字节序
//定义宏:
typedef unsigned int uint_32 ;
typedef unsigned short uint_16 ;
//大小端转换16位:
#define BSWAP_16(x) \
(uint_16)((((uint_16)(x) & 0x00ff) << 8) | \
(((uint_16)(x) & 0xff00) >> 8) \
)
//大小端转换32位:
#define BSWAP_32(x) \
(uint_32)((((uint_32)(x) & 0xff000000) >> 24) | \
(((uint_32)(x) & 0x00ff0000) >> 8) | \
(((uint_32)(x) & 0x0000ff00) << 8) | \
(((uint_32)(x) & 0x000000ff) << 24) \
)
//定义函数:
//大小端转换16位:
uint_16 bswap_16(uint_16 x)
{
return (((uint_16)(x) & 0x00ff) << 8) | \
(((uint_16)(x) & 0xff00) >> 8) ;
}
//大小端转换32位
uint_32 bswap_32(uint_32 x)
{
return (((uint_32)(x) & 0xff000000) >> 24) | \
(((uint_32)(x) & 0x00ff0000) >> 8) | \
(((uint_32)(x) & 0x0000ff00) << 8) | \
(((uint_32)(x) & 0x000000ff) << 24) ;
}