计算机网络笔记:字节序与比特序

1、字节序

所谓字节序是指多字节数据在内存中的存储顺序,通常有两种:小端字节序、大端字节序;

小端字节序:低位字节存放在低位地址,高位字节存放在高位地址;

大端字节序:高位字节存放在低位地址,低位字节存放在高位地址;

例如:十六进制数0x12345678,在两种字节序下的内存存放方式为:

内存地址 0 1 2 3
小端字节序 78 56 34 12
大端字节序 12 34 56 78
一般具有小端字节序的系统为小端系统,具有大端字节序的系统为大端系统。


2、比特序

比特序是指一个字节中的比特在内存中的存放顺序。一般计算机能寻址的最小单元为字节,字节中比特的顺序无从得知,但是事实上比特序跟字节序是一致的。假设计算机能够寻址每个比特,那么:

小端字节序下:低位比特存放在低地址,高位比特存放在高地址;

大端字节序下:高位比特存放在低地址,低位比特存放在高地址;

例如:以上述十六进制数0x12345678的低位字节0x78为例,在两种内存中的存放方式为:

内存地址(每个地址指向一个bit) 0 1 2 3 4 5 6 7
小端字节序 0 0 0 1 1 1 1 0
大端字节序 0 1 1 1 1 0 0 0

3、数据在网络中的传送顺序

一般而言,网络字节序是大端字节序,即在网络中传送的数据都是按照大端方式传送的,先传送高位字节,再传送低位字节;在传送一个字节时,总是按照小端方式传送,先传送一个字节的低位bit,再传送一个字节的高位bit。


4、补充一下查看字节序和比特序的代码,参考http://blog.csdn.net/liuxingen/article/details/45420455/#reply

#include 

int main()
{
	/*查看字节序*/
	union byte_order
	{
		unsigned short a;
		unsigned char  b[2];
	}u_byte_order;
	u_byte_order.a=0x1234;
	printf("low address 0X%x byte: 0X%x\n", (unsigned int)&u_byte_order.b[0], u_byte_order.b[0]);
	printf("high address 0X%x byte: 0X%x\n", (unsigned int)&u_byte_order.b[1], u_byte_order.b[1]);

	/*查看比特序*/
	struct bit_order
	{
		unsigned char a:2,
					  b:3,
					  c:3;
	};
	unsigned char ch = 0x66; //binary:101 | 010 | 10
					 //c  |  b  | a
	struct bit_order *pbit_order = (struct bit_order *)&ch;
	printf("low 2 bit %u\n", (unsigned int)pbit_order->a);
	printf("mid 3 bit %u\n", (unsigned int)pbit_order->b);
	printf("high 3 bit %u\n", (unsigned int)pbit_order->c);
}



你可能感兴趣的:(计算机网络)