博客
关于我
2021-04-29
阅读量:132 次
发布时间:2019-02-26

本文共 1444 字,大约阅读时间需要 4 分钟。

一文彻底弄懂大端与小端

1. 端模式起源

端模式(Endian)起源于《格列佛游记》。书中根据鸡蛋敲开的方式不同将所有人分为两类:从圆头(Big-Endian)开始敲的人被归为大端模式,从尖头(Little-Endian)开始敲的被归为小端模式。这一差异引发了小人国的内战,争夺着究竟应该从哪个头开始敲鸡蛋这个问题。

2. 大小端定义

大端模式(Big-Endian)指高地址存低字节,低地址存高字节。而小端模式(Little-Endian)则相反,低地址存低字节,高地址存高字节。从人类的读写习惯来看,大端模式与我们的习惯更契合,数据先读高地址后读低地址。相比之下,小端模式的存储方式有些反人类,容易引发数据读写上的混淆。

3. 为什么存在大小端

在计算机领域,端模式的定义是数据在存储器中的存放顺序。计算机中的数据类型(如char、short、int等)占用字节大小不同,而处理器的寄存器宽度往往大于单个字节。这就涉及到如何将多字节数据存入寄存器的顺序问题。例如,数字12345678在不同端模式下的存储方式截然不同,直接影响数据的处理和传输方式。

CPU的大小端架构是硬件决定的,常见的处理器端模式如下表所示:

处理器 端模式
Intel X86 Little-Endian
Power-PC Big-Endian
IBM Big-Endian
ARM 默认 Little-Endian
STM32 Little-Endian

网络通讯协议通常采用Big-Endian格式,这种方式有助于统一数据格式,减少转换需求。

4. 大小端的优缺点

小端模式的优势在于它不需要额外的字节顺序调整,直接可以强制转换数据类型。而大端模式的优势则在于其符号位判断固定为第一个字节,便于数据的正负判断和人类阅读。两者各有优劣,选择哪种方式取决于具体场景需求。

5. 代码判断大小端

在实际编程中,判断系统是大端还是小端可以通过简单的代码实现。例如,通过将特定值的高位和低位进行比较,来确定存储顺序。以下是一个常用的判断方法:

bool isLittleEndian() {      unsigned short a = 0x1218;      if (static_cast(a & 0xff00) == 0x18) {          return true;      } else {          return false;      }  }

6. 大小端数据转换

在实际应用中,需要进行大小端转换时,可以使用如下宏定义来实现数据的交换。例如,对于16位和32位数据的转换:

#define BigLittleSwap16(A) (((uint16)(A) & 0xff00) >> 8 | ((uint16)(A) & 0x00ff) << 8)  #define BigLittleSwap32(A) (((uint32)(A) & 0xff000000) >> 24 | \                               (((uint32)(A) & 0x00ff0000) >> 8 | \                               (((uint32)(A) & 0x0000ff00) << 8 | \                               (((uint32)(A) & 0x000000ff) << 24))

转载地址:http://ncvf.baihongyu.com/

你可能感兴趣的文章
OpenCV与AI深度学习 | 基于YoloV8的药丸/片剂类型识别
查看>>
OpenCV与AI深度学习 | 基于YOLO和EasyOCR从视频中识别车牌
查看>>
OpenCV与AI深度学习 | 基于图像处理的火焰检测算法(颜色+边缘)
查看>>
OpenCV与AI深度学习 | 基于拉普拉斯金字塔实现图像融合(步骤 + 代码)
查看>>
OpenCV与AI深度学习 | 基于机器视觉的磁瓦表面缺陷检测方案
查看>>
OpenCV与AI深度学习 | 基于深度学习的轮胎缺陷检测系统
查看>>
OpenCV与AI深度学习 | 如何使用YOLOv9分割图像中的对象
查看>>
OpenCV与AI深度学习 | 如何使用YOLOv9检测图片和视频中的目标
查看>>
OpenCV与AI深度学习 | 如何在 Docker 容器中使用 GPU
查看>>
OpenCV与AI深度学习 | 实战 | OpenCV传统方法实现密集圆形分割与计数(详细步骤 + 代码)
查看>>
OpenCV与AI深度学习 | 实战 | OpenCV实现扫描文本矫正应用与实现详解(附源码)
查看>>
OpenCV与AI深度学习 | 实战 | 使用OpenCV和Streamlit搭建虚拟化妆应用程序(附源码)
查看>>
OpenCV与AI深度学习 | 实战 | 使用YOLOv8 Pose实现瑜伽姿势识别
查看>>
OpenCV与AI深度学习 | 实战 | 使用YoloV8实例分割识别猪的姿态(含数据集)
查看>>
OpenCV与AI深度学习 | 实战 | 使用姿态估计算法构建简单的健身训练辅助应用程序
查看>>
OpenCV与AI深度学习 | 实战 | 基于OpenCV和K-Means聚类实现颜色分割(步骤 + 代码)
查看>>
OpenCV与AI深度学习 | 实战 | 基于YoloV5和Mask RCNN实现汽车表面划痕检测(步骤 + 代码)
查看>>
OpenCV与AI深度学习 | 实战 | 基于YOLOv9+SAM实现动态目标检测和分割(步骤 + 代码)
查看>>
OpenCV与AI深度学习 | 实战 | 基于YOLOv9和OpenCV实现车辆跟踪计数(步骤 + 源码)
查看>>
OpenCV与AI深度学习 | 实战 | 文本图片去水印--同时保持文本原始色彩(附源码)
查看>>