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.youkuaiyun.com/liuxingen/article/details/45420455/#reply
#include <stdio.h>
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);
}
本文介绍了字节序的两种类型——小端字节序和大端字节序,并通过实例解释了它们的内存存储方式。同时,探讨了比特序,虽然在字节层面无从得知,但在可寻址比特的情况下,其顺序与字节序一致。网络中通常采用大端字节序进行数据传输,而在字节内部则按小端方式传送比特。最后,提供了查看字节序和比特序的代码参考链接。
4318

被折叠的 条评论
为什么被折叠?



