cpu的字节序
详细讲解一下何为网络字节序以及何为主机字节序1. Little endian:将低序字节存储在起始地址
2. Big endian:将高序字节存储在起始地址
LE little-endian
最符合人的思维的字节序
地址低位存储值的低位
地址高位存储值的高位
怎么讲是最符合人的思维的字节序,是因为从人的第一观感来说
低位值?。?就应该放在内存地址小的地方,也即内存地址低位
反之,高位值就应该放在内存地址大的地方,也即内存地址高位不同的cpu有不同的字节序类型 这些字节序是指整数在内存中保存的顺序 这个叫做主机序
最常见的有两种
1. little endian:将低序字节存储在起始地址
2. big endian:将高序字节存储在起始地址
le little-endian
最符合人的思维的字节序
地址低位存储值的低位
地址高位存储值的高位
怎么讲是最符合人的思维的字节序,是因为从人的第一观感来说
低位值?。?就应该放在内存地址小的地方,也即内存地址低位
反之 , 高位值就应该放在内存地址大的地方,也即内存地址高位
be big-endian
最直观的字节序
地址低位存储值的高位
地址高位存储值的低位
为什么说直观,不要考虑对应关系
只需要把内存地址从左到右按照由低到高的顺序写出
把值按照通常的高位到低位的顺序写出
两者对照,一个字节一个字节的填充进去
例子:在内存中双字0x01020304(dword)的存储方式
4000 4001 4002 4003
le 04 03 02 01
be 01 02 03 04
例子:如果我们将0x1234abcd写入到以0x0000开始的内存中,则结果为
big-endian little-endian
0x0000 0x120xcd
0x0001 0x230xab
0x0002 0xab0x34
【cpu的字节序】0x0003 0xcd0x12
x86系列cpu都是little-endian的字节序 。
大端小端转换方法:
big-endian转换成little-endian如下:
#define bigtolittle16(a)((((uint16)(a) & 0xff00) >> 8) |
(((uint16)(a) & 0x00ff) << 8))
#define bigtolittle32(a)((((uint32)(a) & 0xff000000) >> 24) |
(((uint32)(a) & 0x00ff0000) >> 8) |
(((uint32)(a) & 0x0000ff00) << 8) |
(((uint32)(a) & 0x000000ff) << 24))
大端小端检测方法:
如何检查处理器是big-endian还是little-endian?
联合体union的存放顺序是所有成员都从低地址开始存放,利用该特性就可以轻松地获得了cpu对内存采用little-endian还是big-endian模式读写 。
int checkcpuendian()
union
unsigned int a;
unsigned char b;
}c;
c 。a = 1;
return (c 。b == 1);
网络字节顺序
网络字节顺序是tcp/ip中规定好的一种数据表示格式,它与具体的cpu类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释 。网络字节顺序采用big endian排序方式 。
为了进行转换 bsd socket提供了转换的函数 有下面四个
htons 把unsigned short类型从主机序转换到网络序
htonl 把unsigned long类型从主机序转换到网络序
ntohs 把unsigned short类型从网络序转换到主机序
ntohl 把unsigned long类型从网络序转换到主机序
在使用little endian的系统中 这些函数会把字节序进行转换
在使用big endian类型的系统中 这些函数会定义成空宏
同样 在网络程序开发时 或是跨平台开发时 也应该注意保证只用一种字节序 不然两方的解释不一样就会产生bug 。
什么是字节序?小头 (LSB):
Least Significant Bit (or Byte)
大头 (MSB):
Most Significant Bit (or Byte)
字节序,即字节在电脑中存放时的序列与输入(输出)时的序列是先到的在前还是后到的在前 。
输入(输出)流字节序:
B1,B2,B3 , B4,B5,B6… 。。
short int a,b , c;
a = B2 << 8B1;
b = B4 << 8B3;
c = B6 << 8B5;
也可能是:
a = B1 << 8B2;
b = B3 << 8B3;
c = B5 << 8B6;
这取决于字节序的约定 。例如GIF图像文件中的许多定义块中的short int 是 a = B2 << 8B1;。。。
即B2左移8位加B1等于一个十六位的整数 。俗称叫大头,小头,也是数据在电脑中存放的时候是高位在前还是低位在前 。是通过网络传输吧?网络中传输一般默认的是使用大头网络字节序与主机字节序
不同的cpu有不同的字节序类型 这些字节序是指整数在内存中保存的顺序 这个叫做主机序
最常见的有两种
1. little endian:将低序字节存储在起始地址
2. big endian:将高序字节存储在起始地址
le little-endian
最符合人的思维的字节序
地址低位存储值的低位
地址高位存储值的高位
怎么讲是最符合人的思维的字节序 , 是因为从人的第一观感来说
低位值?。?就应该放在内存地址小的地方,也即内存地址低位
反之,高位值就应该放在内存地址大的地方,也即内存地址高位
be big-endian
最直观的字节序
地址低位存储值的高位
地址高位存储值的低位
为什么说直观,不要考虑对应关系
只需要把内存地址从左到右按照由低到高的顺序写出
把值按照通常的高位到低位的顺序写出
两者对照,一个字节一个字节的填充进去
例子:在内存中双字0x01020304(dword)的存储方式
4000 4001 4002 4003
le 04 03 02 01
be 01 02 03 04
例子:如果我们将0x1234abcd写入到以0x0000开始的内存中,则结果为
big-endianlittle-endian
0x00000x120xcd
0x00010x230xab
0x00020xab0x34
0x00030xcd0x12
x86系列cpu都是little-endian的字节序 。
网络字节顺序是tcp/ip中规定好的一种数据表示格式,它与具体的cpu类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释 。网络字节顺序采用big endian排序方式 。
为了进行转换 bsd socket提供了转换的函数 有下面四个
htons 把unsigned short类型从主机序转换到网络序
htonl 把unsigned long类型从主机序转换到网络序
ntohs 把unsigned short类型从网络序转换到主机序
ntohl 把unsigned long类型从网络序转换到主机序
在使用little endian的系统中 这些函数会把字节序进行转换
在使用big endian类型的系统中 这些函数会定义成空宏
同样 在网络程序开发时 或是跨平台开发时 也应该注意保证只用一种字节序 不然两方的解释不一样就会产生bug 。
1、网络与主机字节转换函数:htons ntohs htonl ntohl (s 就是short l是long h是host n是network)
2、不同的cpu上运行不同的操作系统,字节序也是不同的,参见下表 。
处理器操作系统字节排序
alpha全部little endian
hp-pantlittle endian
hp-paunixbig endian
intelx86全部little endian
2006-01-07
0
推荐阅读
- 凯迪拉克是哪个国家生产的? 凯迪拉克是哪个国家的品牌车
- 排气筒里的粉末是什么? 汽车排气筒里面含什么贵金属
- 汽车SRS系统是什么?
- 银杏树春天的样子
- 车上的SYNC功能是什么?
- 15t的发动机加什么机油最合适
- ECO模式的作用是什么?
- 公司的车怎么绑定交管12123
- 在苏州学车,考驾照。哪个驾校是比较好的选择?
- 怎么删除58同城手机版刚发布的信息