位域,大小端,比特序

本文介绍了计算机中两种主要的数据存储格式:小端(LSB, Least Significant Byte)和大端(MSB, Most Significant Byte)。小端格式从低位开始分配空间,而大端格式则从高位开始分配。理解这两种格式对于跨平台数据交换和处理至关重要。

小端:LSB, 从低位开始分配空间

大端:MSB,从高位开始分配空间

参考:

http://www.cnblogs.com/chencheng/archive/2012/06/19/2554081.html

这段话的意思是: > **网络协议通常使用大端(Big-endian)传输数据,而主机系统可能是小端(Little-endian)。为了正确解析协议字段,如果主机是小端,就需要在定义时将比特的顺反过来,以补偿大小端转换带来的颠倒。** --- ### ✅ 分步解析: #### 1. **大端 vs 小端(Byte Endianness)** - **大端**:高字节在前(低地址),低字节在后(高地址) - 示例:`0x12345678` → 内存顺为 `12 34 56 78` - **小端**:低字节在前(低地址),高字节在后(高地址) - 示例:`0x12345678` → 内存顺为 `78 56 34 12` #### 2. **比特(Bit Endianness)** - **大端比特**:高比特在前(左边),低比特在后(右边) - 即:bit7 bit6 ... bit0 - **小端比特**:低比特在前(左边),高比特在后(右边) - 即:bit0 bit1 ... bit7 > ⚠️ 注意:C语言中**比特是编译器决定的**,并不一定与平台的字节一致。 --- ### ✅ 理解原话的几个关键点 > “**一般网络协议都是大端**” - 网络协议(如TCP/IP)中传输的整数字节是大端(即网络字节),例如IP头部、TCP头部中的字段。 - 在解析这些字段时,如果主机是小端,需要进行字节转换(如 `ntohl()`、`ntohs()`)。 > “**大端低地址存储高**” - 这是对大端的描述:一个32整数,高字节存储在低地址。 > “**如果主机是小端,则按照协议规定反着定义即可**” - 如果协议字段是按大端比特定义的(高在前),而主机是小端比特(低在前),则需要将定义反过来,才能正确映射字段。 > “**因为大小端转换的话,bit置就是逆**” - 当进行大小端转换(如 `htonl()`、`ntohl()`)时,不仅字节顺反转,**每个字节内部的bit顺也会反转**(如果使用结构体来解析字段)。 --- ### ✅ 示例说明 假设有一个8协议字段,其定义如下(大端比特): | bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 | |------|------|------|------|------|------|------|------| | type | type | mode | mode | flag | flag | flag | flag | 在C语言中,如果主机是小端,使用解析该字段时应**反过来定义**: ```c struct { unsigned int flag : 4; // bit0 ~ bit3 unsigned int mode : 2; // bit4 ~ bit5 unsigned int type : 2; // bit6 ~ bit7 } field; ``` > 因为当小端系统读取一个大端协议字段时,**每个字节的内容会被交换顺**,导致比特也颠倒了。 --- ### ✅ 总结 | 项目 | 说明 | |------|------| | 网络协议通常使用大端 | 是的,如TCP/IP使用的网络字节 | | 主机可能是小端 | 常见平台如x86/x64是小端 | | 定义需要“反着来” | 是的,如果使用结构体解析协议字段 | | 大小端转换导致bit颠倒 | 是的,特别是当协议字段是按大端比特定义时 | | 建议 | 对协议字段尽量使用操作(移、掩码)而非结构体解析 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值