处理器字节大小端存储方式、网络字节顺序(总结)

1、大小端存储方式

       为什么会有大小端模式之分呢?这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为 8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大于 8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。

        大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;这和我们的阅读习惯一致。

小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。例如一个16bit的short型x,在内存中的地址为0x0010,x的值为0x1122,那么0x11为高字节,0x22为低字节。对于 大端模式,就将0x11放在低地址中,即0x0010中,0x22放在高地址中,即0x0011中。小端模式,刚好相反。对于32bit的int型,如下:

0000430: e684 6c4e 0100 1800 53ef 0100 0100 0000
0000440: b484 6c4e 004e ed00 0000 0000 0100 0000
在大端模式下,前32位应该这样读: e6 84 6c 4e ,在小端模式下,前32位应该这样读: 4e 6c 84 e6
我们常用的X86结构是小端模式,而KEIL C51则为大端模式。VC6.0编译程序如下:
	int i = 0x1234;

	printf("&i address  is %p\n", &i);
	printf("&i+1 address  is %p\n", &i+1);
	printf("&i address data is %p\n\n",*(&i));

	printf("(char*)&i address is %p\n", (char*)&i);
	printf("(char*)&i+1 address is %p\n", (char*)&i+1);
	printf("(char*)&i address data is %p\n", *(char*)&i);
	printf("(char*)&i+1 address data is %p\n", *((char*)&i+1));
结果如下:
&i address  is 0012FF7C
&i+1 address  is 0012FF80
&i address data is 00001234


(char*)&i address is 0012FF7C
(char*)&i+1 address is 0012FF7D
(char*)&i address data is 00000034
(char*)&i+1 address data is 00000012
2、网络字节顺序
我们知道网络上的数据流是字节流,对于一个多字节数值,在进行网络传输的时候,先传递哪个字节?也就是说,当接收端收到第一个字节的时候,它是将这个字节作为高位还是低位来处理呢?网络字节序定义:收到的第一个字节被当作高位看待,这就要求发送端发送的第一个字节应当是高位。而在发送端发送数据时,发送的第一个字节是该数字在内存中起始地址对应的字节。可见多字节数值在发送前,在内存中数值应该以大端法存放。比如我们经过网络发送32bit整型数据0x12345678,在cortex-M3平台中,它是以小端法存放的,在发送前需要使用系统提供的htonl将其转换成大端法 存放。
lwip中字节转换函数:
uint32_t htonl(uint32_t hostlong);//32位的主机字节序转换到网络字节序
	uint16_t htons(uint16_t hostshort);//16位的主机字节序转换到网络字节序
	uint32_t ntohl(uint32_t netlong);//32位的网络字节序转换到主机字节序
	uint16_t ntohs(uint16_t netshort);//16位的网络字节序转换到主机字节序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值