c语言网络字节序整数,c语言字节序和网络字节序.doc

c语言字节序和网络字节序

c语言 字节序和网络字节序

1 字节序

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

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

01234567Byte3Byte2Byte1Byte0高位字节--à

内存地址序号字节在内存中的地址16进制值0x03Byte3010x02Byte2230x01Byte1450x00Byte067大尾就是高位字节排放在内存的低端,低位字节排放在内存的高端。例如一个4字节的值为0x1234567的整数与高低字节对应关系:

01234567Byte3Byte2Byte1Byte0高位字节--à

内存地址序号字节在内存中的地址16进制值0x03Byte0670x02Byte1450x01Byte2230x00Byte3012 网络字节序

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

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

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

char s[4] “abc”;

abc\0s[0]s[1]s[2]s[3]将在内存中按照如下顺序排放:

内存地址序号16进制值指针P的位置0xbffeadf7\0p+30xbffeadf6cp+20xbffeadf5bp+10xbffeadf4apint 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位无 符号整数从网络字节序转换成本地字节序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值