代码之家  ›  专栏  ›  技术社区  ›  sud03r

位顺序和结束符

  •  6
  • sud03r  · 技术社区  · 14 年前

    我正在逐字节读取文件。

    例如,我有一个字节:0x41(0100 0001),用十六进制表示。

    现在,我要这个字节的前三位,即(010)。

    我可以使用位逻辑提取前三位,但我的问题是前三位是否独立于机器的尾数(即它们不能是001)?

    谢谢,

    6 回复  |  直到 14 年前
        1
  •  7
  •   Michael Burr    14 年前

    另一种方法是,只有当您可以单独读取一个项目的组件时,才应用结束符,因为您通常可以独立地从内存中读取32位int的单个字节,如果您想将这些字节解释为32位int,则不必确保架构的结束符考虑在内。在。

    通常情况下,你不能从存储器中读取一个字节的单个位,因此就存储器结构而言,实际上没有“位端序”的概念(我确信在硬件级,但在软件级你看不到)。可能需要处理(或至少要注意)位端性的几个方面:

    1. 编译器存储位字段位的顺序取决于编译器(不一定与硬件平台的端点相关-不同的编译器可能对同一平台的位字段进行不同的排序-编译器可能使用命令行选项以某种方式配置,类似于 char 可能设置为有符号或无符号)。然而,C位字段实际上与硬件寻址无关。

    2. 一些硬件体系结构允许您处理单个位(例如ARM Cortex M3),因此在这种情况下,如果要使用该功能,您需要知道体系结构如何安排位的寻址。

    3. 如果您是通过串行链路发送位,那么硬件接口通常会指定最重要的位还是最不重要的位首先在线路上“移位”。

        2
  •  7
  •   sharptooth    14 年前

    endianness只适用于字节顺序,而不是位顺序。位的顺序在相应的字节内是相同的。

        3
  •  3
  •   unwind    14 年前

    是的,它们是一样的。

    字节内的位排序通常只在进行逐位I/O时才是一个问题,例如在读取通过串行线路发送的数据流时。它们一次只发送一个比特,所以发送方和接收方需要就每个字节的比特是从左到右还是从右到左发送达成一致。

    对于文件和内存访问,字节内的位顺序不变。

        4
  •  1
  •   Denis Howe    14 年前

    有点混乱。除串行通信外,“第一位”一词没有意义,只有最左(最重要)和最右(最不重要)位。如果有人告诉你提取“前三位”,那么打他们一巴掌,问他们什么意思。即使术语“位0”是不明确的,它通常意味着最低有效位、最右边的位(2**0位),但在某些位字段中,它几乎同样常用于表示最高有效位、最左边的位。哪个位是字节中的“第一”位完全取决于您对这些位所做的操作。

        5
  •  1
  •   caf    14 年前

    C中的位运算符被定义为 价值观 . 表达式 0x41U >> 5 将始终给出值2(二进制,010)。

        6
  •  1
  •   Mike Beckerle    11 年前

    当一个字段使用一个字节的一部分,或者跨越一个字节的开始或结束(或两者)的字节时,位顺序很重要。

    示例:2个字节的数据first 235(decimal)second 173(decimal),aka hex eb和ad。

    我想要一个位域,从第四位开始,到第十二位。所以,跳过3位,从接下来的9位中得到9位无符号整数。

    我声称有4种可能的结果:

      byteOrder,    bitOrder
    
    * bigEndian,    bigEndian    results in hex 0BA or decimal 186
    * littleEndian, littleEndian results in hex 1BD or decimal 445
    * littleEndian, bigEndian    results in hex 05D or decimal 93
    * bigEndian,    littleEndian results in hex 1DE or decimal 478
    

    我在数据中看到了这4个中的前3个。大,大,小,小都很容易解决。

    提示处理此问题。

    如果字节顺序是big-endian,则从左到右写下字节。 如果字节顺序为little endian,则从右到左写下字节。