当前位置: 首页 > news >正文

大小端字节序详解

小端字节序(Little-Endian)的概念

小端字节序(Little-Endian)是一种数据在内存中的存储方式,其特点是:

  • 低字节(Least Significant Byte, LSB)存储在低地址

  • 高字节(Most Significant Byte, MSB)存储在高地址

示例(uint16_t 数据 0x1234 的存储方式)
内存地址字节内容(小端)
addr0x34 (低字节)
addr+10x12 (高字节)

代码解析:leBytesToU16 如何转换小端字节序

u_int16_t leBytesToU16(const u_int8_t* bytes) {return (static_cast<u_int16_t>(bytes[1]) << 8) | static_cast<u_int16_t>(bytes[0]);
}
步骤分解
  1. 输入bytes 是一个指向小端存储的 2 字节数组(如 {0x34, 0x12})。

  2. 操作

    • bytes[1](高字节 0x12)左移 8 位 → 0x1200

    • bytes[0](低字节 0x34)保持不变 → 0x0034

    • 按位或(|)合并结果:0x1200 | 0x0034 = 0x1234

  3. 输出:正确的 uint16_t 值 0x1234


对比大端字节序(Big-Endian)

大端字节序(Big-Endian)的存储方式相反:

  • 高字节存储在低地址低字节存储在高地址

  • 例如 0x1234 在大端中存储为 {0x12, 0x34}

大端转换代码(对比)
u_int16_t beBytesToU16(const u_int8_t* bytes) {return (static_cast<u_int16_t>(bytes[0]) << 8) | static_cast<u_int16_t>(bytes[1]);
}

为什么需要小端转换?

  1. 跨平台兼容性

    • 不同硬件(如 x86 是小端,网络协议通常用大端)可能导致数据解析错误。

    • 需显式转换以确保数据一致性。

  2. 读取外部数据

    • 文件、网络数据流可能采用小端/大端存储,需按约定解析。


验证代码的测试用例

#include <iostream>
#include <cassert>int main() {u_int8_t littleEndianData[] = {0x34, 0x12}; // 小端存储的 0x1234u_int16_t result = leBytesToU16(littleEndianData);assert(result == 0x1234); // 验证转换正确std::cout << std::hex << "Result: 0x" << result << std::endl;return 0;
}

输出

Result: 0x1234

关键点总结

  1. 小端存储:低字节在前,高字节在后。

  2. 转换逻辑:高字节左移 + 低字节合并。

  3. 应用场景:处理二进制数据、网络协议、跨平台数据交换。

如果需要处理更长的数据类型(如 uint32_t),方法类似,但需调整移位位数(如 << 16<< 24)。

http://www.dtcms.com/a/308935.html

相关文章:

  • LCGL使用简介
  • Kubernetes架构概览
  • 2025虚幻5光明之魂开发思考1——借鉴软件工程
  • Dify 从入门到精通(第 6/100 篇):配置你的第一个 LLM:OpenAI、Claude 和 Ollama
  • kafka使用kraft
  • QT 动态属性和静态属性
  • Spring框架与AutoCAD结合应用
  • 2025年6月人工智能领域研究热点扫描|人工智能顶级期刊TPAMI
  • vue3 v-html绑定数据,点击sub实现popover效果
  • kamailio uac_req_send()
  • 项目中如何定义项目范围
  • 【Kiro Code 从入门到精通】重要的功能
  • 删除无效索引:提升写入性能的维护技巧
  • Linux日志管理与时间同步
  • 05 GWAS表型数据处理原理
  • Protobuf动态解析
  • 蓝牙耳机充不进去电怎么办?以换代修更简单!
  • 八股训练--Spring
  • Spring Batch参数校验失败问题分析:JobParametersValidator校验了两次JobParametersIncrementer的参数
  • 详解Vite 配置中的代理功能
  • JavaScript内存管理完全指南:从入门到精通
  • 智能化问题分析(Cherry Stdio+ MCP)
  • VS2022将.net4.8工程升级到.net6.0
  • 蚂蚁财富招Java高级研发
  • 基于deepseek的文本解析 - 超长文本的md结构化
  • AD域设计与管理-域策略-进阶
  • logging格式化输出日志asctime等详解
  • YOLOv13 汉化优化部署版本:超图增强自适应视觉感知的目标检测系统
  • 人工智能概念之十一:常见的激活函数与参数初始化
  • Python Day20 os模块 和 文件操作 及 例题分析