Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2054968
  • 博文数量: 1000
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 7921
  • 用 户 组: 普通用户
  • 注册时间: 2013-08-20 09:23
个人简介

storage R&D guy.

文章分类

全部博文(1000)

文章存档

2019年(5)

2017年(47)

2016年(38)

2015年(539)

2014年(193)

2013年(178)

分类: 服务器与存储

2014-09-03 10:46:12

字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有小端、两种字节顺序。小端指低字节数据存放在内存低地址处,高字节数据存放在内存高地址处;大端字节序是高字节数据存放在低地址处,低字节数据存放在高地址处。

网络字节顺序采用 big endian (大端)排序方式 , 即将低位字节排在前。

不同的 CPU 有不同的字节序类型 这些字节序是指整数在内存中保存的顺序 这个叫做主机序
最常见的有两种

1
. Little endian :将低序字节存储在起始地址
2
. Big endian :将高序字节存储在起始地址

note:

java中对int转byte, 永远是去低8位的字节, 不用去管系统内部字节顺序. 当你传向网络时, 你就要自己进行网络字节顺序发, 先发低位字节,再发高位字节.



LE little-endian
最符合人的思维的字节序
地址低位存储值的低位

地址高位存储值的高位

怎么讲是最符合人的思维的字节序,是因为从人的第一观感来说

低位值小,就应该放在内存地址小的地方,也即内存地址低位

反之,高位值就应该放在内存地址大的地方,也即内存地址高位


BE big-endian
最直观的字节序

地址低位存储值的高位

地址高位存储值的低位

为什么说直观,不要考虑对应关系

只需要把内存地址从左到右按照由低到高的顺序写出

把值按照通常的高位到低位的顺序写出

两者对照,一个字节一个字节的填充进去


例子:如果我们将 0x1234abcd 写入到以 0x0000 开始的内存中,则结果为

        big-endian   little-endian
0x0000   0x12       0xcd
0x0001   0x23       0xab
0x0002   0xab       0x34
0x0003   0xcd       0x12
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-PA     NT     Little endian
HP-PA     UNIX     Big endian
Intelx86    
全部      Little endian <-----x86 系统是小端字节序系统

Motorola680x()    
全部      Big endian
MIPS     NT     Little endian
MIPS     UNIX     Big endian
PowerPC     NT     Little endian
PowerPC    
非 NT     Big endian   <-----PPC 系统是大端字节序系统

RS/6000     UNIX     Big endian
SPARC     UNIX     Big endian
IXP1200 ARM
核心      全部      Little endian

阅读(1036) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~