位排序和字节顺序

时间:2010-04-14 07:08:14

标签: c bit-manipulation endianness

我正在逐字节地读取文件。

比如说我有这个字节:0x41(0100 0001)以十六进制表示。

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

我可以使用按位逻辑来提取前三位,但我的问题是前三位是否与机器的字节顺序无关。(即它们不能是001)?

谢谢,

6 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:7)

另一种思考方式是,只有当你能够单独读取项目的组件时,才会应用字节序 - 因为如果要解释这些字节,通常可以独立地从内存中读取32位int的各个字节。作为一个32位的int,你需要确保考虑架构的endianess。

通常你不能从内存中读取一个字节的各个位,所以就存储器架构而言,确实没有“位字节式”的概念(我确信存在硬件级别,但不是你可以在软件层面看到的东西)。您可能需要处理(或至少知道)位字节序的几个方面:

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

  2. 某些硬件架构允许您处理单个位(例如ARM Cortex M3),因此在这种情况下,您需要知道如果要使用该位,架构如何安排用于寻址的位特征

  3. 如果您通过串行链路发送位 - 硬件接口通常会指定最高有效位或最低有效位是否先在线路上“移位”。

答案 2 :(得分:3)

是的,他们将是一样的。

当您在读取通过串行线路发送的数据流时进行逐位I / O时,字节内的位排序通常只是一个问题。那些确实一次发送一个比特,所以发送者和接收者需要同意每个字节是从左到右还是从右到左发送比特。

对于文件和内存中访问,字节内的位排序不会改变。

答案 3 :(得分:1)

有点混乱:-)。除串行通信外,术语“第一位”没有意义,只有最左侧(最高位)和最右侧(最低位)位。如果有人告诉你要提取“前三位”然后给他们一个耳光并问他们的意思。即使术语“位0”是模糊的,它通常意味着最低有效位,最右位(2 ** 0位),但几乎常用于表示某些位域中最重要的最左位。哪个位是字节中的“第一”位完全取决于您对这些位的处理。

答案 4 :(得分:1)

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

答案 5 :(得分:1)

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

示例:2字节数据先235(十进制)秒173(十进制),又名十六进制EB和AD。

我想要从第4位开始到第12位的位字段。因此,跳过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个。大,小,小,很容易锻炼。

提示处理此问题。

如果字节顺序是大端,则从左向右写下字节。 如果字节顺序是小端,则从右向左写入字节。