现在的位置: 首页 > 综合 > 正文

字节序和网络字节序

2014年01月27日 ⁄ 综合 ⁄ 共 1357字 ⁄ 字号 评论关闭
文章目录
Technorati 标签: ,

字节序和网络字节序

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

大尾就是高位字节排放在内存的低端,低位字节排放在内存的高端。例如一个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位无符号整数从网络字节序转换成本地字节序

抱歉!评论已关闭.