Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1882585
  • 博文数量: 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

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