整数与字节序列相互转换
目录
整数与字节序列相互转换
以下函数是用于二进制编解码的核心工具函数,实现 32/64 位整数与字节流之间的高效转换。
- 操作逻辑 :将整数的每个字节依次写入缓冲区,从最低有效字节到最高有效字节
- 内存布局 :假设 value=0x12345678,地址由低到高依次是0x78 0x56 0x34 0x12
编码函数(整数 -> 字节流)
// 将 32 位整数编码到字节缓冲区(小端序)
void toBytes(char* dst, uint32_t value) {
uint8_t* bytes = reinterpret_cast<uint8_t*>(dst);
bytes[0] = static_cast<uint8_t>(value);
bytes[1] = static_cast<uint8_t>(value >> 8);
bytes[2] = static_cast<uint8_t>(value >> 16);
bytes[3] = static_cast<uint8_t>(value >> 24);
}
// 将 64 位整数编码到字节缓冲区(小端序)
void toBytes(char* dst, uint64_t value) {
uint8_t* const bytes = reinterpret_cast<uint8_t*>(dst);
bytes[0] = static_cast<uint8_t>(value);
bytes[1] = static_cast<uint8_t>(value >> 8);
bytes[2] = static_cast<uint8_t>(value >> 16);
bytes[3] = static_cast<uint8_t>(value >> 24);
bytes[4] = static_cast<uint8_t>(value >> 32);
bytes[5] = static_cast<uint8_t>(value >> 40);
bytes[6] = static_cast<uint8_t>(value >> 48);
bytes[7] = static_cast<uint8_t>(value >> 56);
}
解码函数(字节流 -> 整数)
// 从字节缓冲区解码 32 位整数(小端序)
uint32_t toUint32(const char* ptr) {
const uint8_t* const bytes = reinterpret_cast<const uint8_t*>(ptr);
return (static_cast<uint32_t>(bytes[0])) |
(static_cast<uint32_t>(bytes[1]) << 8) |
(static_cast<uint32_t>(bytes[2]) << 16) |
(static_cast<uint32_t>(bytes[3]) << 24);
}
// 从字节缓冲区解码 64 位整数(小端序)
uint64_t toUint64(const char* ptr) {
const uint8_t* const bytes = reinterpret_cast<const uint8_t*>(ptr);
return (static_cast<uint64_t>(bytes[0])) |
(static_cast<uint64_t>(bytes[1]) << 8) |
(static_cast<uint64_t>(bytes[2]) << 16) |
(static_cast<uint64_t>(bytes[3]) << 24) |
(static_cast<uint64_t>(bytes[4]) << 32) |
(static_cast<uint64_t>(bytes[5]) << 40) |
(static_cast<uint64_t>(bytes[6]) << 48) |
(static_cast<uint64_t>(bytes[7]) << 56);
}
典型应用场景
- 序列化协议:网络协议(如 TCP 包头)、二进制文件格式
- 内存敏感操作:数据库键值存储、高性能日志系统
- 跨平台数据交换:确保不同架构设备间的数据正确解析