您的位置:首页 > 理论基础 > 计算机网络

网络字节序与主机字节序

2010-08-03 11:14 267 查看
1、

本地字节序


于不同的计算机系统采用不同的字节序存储数据,同样一个4字节的32位整数,在内存中存储的方式就不同. 字节序分为小尾字节序(Little
Endian)和大尾字节序(Big Endian), Intel处理器大多数使用小尾字节序,
Motorola处理器大多数使用大尾(Big Endian)字节序;

小尾就是低位字节排放在内存的低端,高位字节排放在内存的高端。例如一个4字节的值为0x1234567的整数与高低字节对应关系:

01

23

45

67

Byte3

Byte2

Byte1

Byte0

高位字节--

à

---------

à

--------------

à

低位字节

将在内存中按照如下顺序排放:

内存地址序号

字节在内存中的地址

16

进制值

0x03

Byte3

01

0x02

Byte2

23

0x01

Byte1

45

0x00

Byte0

67

如果有char a[2]={0x9c, 0x88},则直接转换为unsigned short int之后的值为 *((unsigned short int *)aa) == 0x889c

大尾就是高位字节排放在内存的低端,低位字节排放在内存的高端。例如一个4字节的值为0x1234567的整数与高低字节对应关系:

01

23

45

67

Byte3

Byte2

Byte1

Byte0

高位字节--

à

---------

à

--------------

à

低位字节

将在内存中按照如下顺序排放:

内存地址序号

字节在内存中的地址

16

进制值

0x03

Byte0

67

0x02

Byte1

45

0x01

Byte2

23

0x00

Byte3

01

2、

网络字节序

TCP/IP

各层协议将字节序定义为大尾,因此TCP/IP协议中使用的字节序通常称之为网络字节序。

3、
字串在内存中的存储(intel系列)


字串和整数是相反的,是安字串的索引从低到高存储到内存中的;

char s[4] =

“abc”;

a

b

c

/0

s[0]

s[1]

s[2]

s[3]

将在内存中按照如下顺序排放:

内存地址序号

16

进制值

指针P的位置

0xbffeadf7

/0

p+3

0xbffeadf6

c

p+2

0xbffeadf5

b

p+1

0xbffeadf4

a

p

int main(void)

{

char s[4] = "abc";

char *p = s;

printf("%02x,
%02x,
%02x,
%02x/n", &s[0], &s[1],
&s[2], &s[3]);

printf("%02x,
%02x,
%02x,
%02x/n", p, p+1, p+2, p+3);

printf("%c,
%c, %c, %c/n", s[0], s[1], s[2],
s[3]);

return 0;

}

输出结果:

[netcool@HFINMSP2 demo]$
./demo001

bffeadf4,
bffeadf5,
bffeadf6,
bffeadf7

bffeadf4,
bffeadf5,
bffeadf6,
bffeadf7

a,
b,
c,

4、整数数组在内存中的存储(intel系列)

同字串一样,但是数组里的每一个整数的存储是按照小尾字节序;

5、
linux系统中的处理方法


网络字节序作为一个标准字节序,如果系统并没有提供相关的转换函数,我们可以通过以下4个宏实现本地字节序和网络字节序的相互转换:

htons():

将16位无符号整数从本地字节序转换成网络字节序

htonl():

将32位无符号整数从本地字节序转换成网络字节序

ntohs():

将16位无符号整数从网络字节序转换成本地字节序

ntohl():

将32位无符号整数从网络字节序转换成本地字节序

转自 http://blog.sina.com.cn/s/blog_4c8b12b90100hjww.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: