【字节序】

1. 字节序(Endianness)问题

不同计算机体系结构可能采用不同的字节序来存储多字节数据。字节序有两种主要形式:

大端序(Big-endian):高位字节存储在低地址。
小端序(Little-endian):低位字节存储在低地址。
例如,32位整数 0x12345678 的存储方式在不同字节序下如下:

大端序:12 34 56 78
小端序:78 56 34 12
为了确保不同平台之间的数据一致性,需要明确数据的字节序,并在传输或存储时进行适当的转换。

2.网络字节序

网络协议(如TCP/IP)通常规定了使用大端序(也称为网络字节序)来传输数据。这意味着无论发送方和接收方使用的是什么本地字节序,在传输数据时,都需要将数据转换为大端序格式。

3. 具体实现方式

拆分数据
在发送数据之前,需要将多字节数据拆分为单个字节,并按网络字节序进行传输。例如:

uint32_t uLength = 0x12345678;
szNetSendBuf[0] = (uLength >> 24) & 0xFF; // 高字节
szNetSendBuf[1] = (uLength >> 16) & 0xFF;
szNetSendBuf[2] = (uLength >> 8) & 0xFF;
szNetSendBuf[3] = uLength & 0xFF;         // 低字节

重新组合数据
在接收数据时,需要将接收到的字节按照相同的字节序重新组合成原始数据:

uint32_t uLengthReconstructed = 0;
uLengthReconstructed |= szNetSendBuf[0] << 24;
uLengthReconstructed |= szNetSendBuf[1] << 16;
uLengthReconstructed |= szNetSendBuf[2] << 8;
uLengthReconstructed |= szNetSendBuf[3];

4. 文件存储中的应用

在文件存储中,为了确保数据在不同系统之间的兼容性,也需要明确存储的数据格式和字节序。常见的做法是:
  使用固定的字节序:例如,指定文件中所有多字节数据使用大端序或小端序。
  在文件头中记录字节序:有些文件格式会在文件头部记录字节序信息,读取文件时根据此信息选择适当的字节序进行解析。

5. 实际例子

网络传输中的例子
假设我们需要通过网络发送一个32位整数:

发送端代码:

#include <cstdint>
#include <cstring> // For memcpy

void sendLength(uint32_t length) {
    uint8_t buffer[4];
    buffer[0] = (length >> 24) & 0xFF;
    buffer[1] = (length >> 16) & 0xFF;
    buffer[2] = (length >> 8) & 0xFF;
    buffer[3] = length & 0xFF;

    // send buffer over network
}

接收端代码:

#include <cstdint>

uint32_t receiveLength(const uint8_t* buffer) {
    uint32_t length = 0;
    length |= buffer[0] << 24;
    length |= buffer[1] << 16;
    length |= buffer[2] << 8;
    length |= buffer[3];
    return length;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值