美文网首页
多字节传输的大小端问题

多字节传输的大小端问题

作者: 董江鹏 | 来源:发表于2017-11-16 13:24 被阅读0次

在几乎所有的机器上,多字节对象都被存储为连续的字节序列。例如在C语言中,一个类型为int的变量x地址为0x100,那么其对应地址表达式&x的值为0x100。且x的四个字节将被存储在存储器的0x100, 0x101, 0x102, 0x103位置。

而存储地址内的排列则有两个通用规则。一个多位的整数将按照其存储地址的最低或最高字节排列。如果最低有效位在最高有效位的前面,则称小端序;反之则称大端序。在网络应用中,字节序是一个必须被考虑的因素,因为不同机器类型可能采用不同标准的字节序,所以均按照网络标准转化。

例如假设上述变量x类型为int,位于地址0x100处,它的十六进制为0x01234567,地址范围为0x100~0x103字节,其内部排列顺序依赖于机器的类型。大端法从首位开始将是:0x100: 01, 0x101: 23..而小端法将是:0x100: 67, 0x101: 45..

对于单一的字节(a byte),大部分处理器以相同的顺序处理位元(bit),因此单字节的存放方法和传输方式一般相同。

对于多字节数据,如整数(32位机中一般占4字节),在不同的处理器的存放方式主要有两种,以内存中0x0A0B0C0D的存放方式为例,分别有以下几种方式:

  1. 大端序(big-endian)或称大尾序:
  • 数据以8bit为单位:
    地址增长方向 →
    ... 0x0A 0x0B 0x0C 0x0D ...
    示例中,最高位字节是0x0A 存储在最低的内存地址处。下一个字节0x0B存在后面的地址处。正类似于十六进制字节从左到右的阅读顺序。
  • 数据以16bit为单位:
    地址增长方向 →
    ... 0x0A0B 0x0C0D ...
    最高的16bit单元0x0A0B存储在低位。
  1. 小端序(little-endian)或称小尾序。
  • 数据以8bit为单位:
    地址增长方向 →
    ... 0x0D 0x0C 0x0B 0x0A ...
    最低位字节是0x0D 存储在最低的内存地址处。后面字节依次存在后面的地址处。
  • 数据以16bit为单位:
    地址增长方向 →
    ... 0x0C0D 0x0A0B ...
    最低的16bit单元0x0C0D存储在低位。
    更改地址的增长方向:
    当更改地址的增长方向,使之由右至左时,表格更具有可阅读性。
    ← 地址增长方向
    ... 0x0A 0x0B 0x0C 0x0D ...
    最低有效位(LSB)是0x0D 存储在最低的内存地址处。后面字节依次存在后面的地址处。
    ← 地址增长方向
    ... 0x0A0B 0x0C0D ...
    最低的16bit单元0x0C0D存储在低位。
  1. 混合序(middle-endian)具有更复杂的顺序。0x0A0B0C0D被存储为:
    地址增长方向 →
    ... 0x0B 0x0A 0x0D 0x0C ...
    可以看作高16bit和低16bit以大端序存储,但16bit内部以小端存储。

相关文章

  • 多字节传输的大小端问题

    在几乎所有的机器上,多字节对象都被存储为连续的字节序列。例如在C语言中,一个类型为int的变量x地址为0x100,...

  • 2018-04-16

    丛林战争Socket: 字节转换问题【数据在服务端和客户端之间传输时由于只能传输Byte[],因此需要把要传输的数...

  • Java 字段在内存中存储是大端还是小端

    Java 字段在内存中是小端存储的,即低位字节在前,高位字节在后。 大小端的最小单位是字节,即大小端决定的是字节的...

  • 字节大小端

    大端模式(Big-endian),是指数据的高字节,保存在内存的低地址中,而数据的低字节,保存在内存的高地址中(T...

  • C++网络编程小心得

    网络当前总结 (乱入)split 字符串 socket 传输字节序问题 由于进行网络传输涉及到大端序小端序问题,基...

  • 大小端字节序

    内存逻辑上是一个大的字节数组,当存储大于一个字节的数据时就有字节序的问题。 大小端经常弄混,这里有种简单的记忆方法...

  • 大小端字节序

    字节序,或字节顺序("Endian"、"endianness" 或 "byte-order"),描述了计算机如何组...

  • 字节对齐与大端小端与内存区域划分

    字节对齐 C语言字节对齐C语言字节对齐/7213465 大端小端 字节序(大小端)详解从高低地址和高低位开始理解(...

  • stm32F1---串口+DMA中断,接收定长数据

    遇到串口发送要点几下发送的问题:注意当DMA缓冲区即自己定义的数组的大小大于传输字节时,需要累积传输个数达到数组大...

  • MQTT

    MQTT使用的底层传输协议基础设施。 客户端使用它连接服务端。 它提供有序的、可靠的、双向字节流传输。 客户端 C...

网友评论

      本文标题:多字节传输的大小端问题

      本文链接:https://www.haomeiwen.com/subject/xtelvxtx.html