当位的顺序(而非字节)至关重要时的字节序问题

4
所有有关字节序的问题和答案似乎都集中在字节的顺序上,但假设我有一系列位(bit),其中位(bit)的顺序至关重要。假设我将它们保存为字节数组(byte array)的内存棒文件。某一天,我可能会在使用小端机器时使用这个内存棒,而在使用大端机器时使用另一个内存棒。
假设位序列如下:
10000000 00000001

我使用的是小端机器,但我总是将字节保存为大端格式,因此我需要反转每个字节中的位,以便将它们保存到存储设备中。

00000001 10000000.

第二天,我将它们读入到一个uint8_t数组中,在完全不同的机器上。我假设(有人能确认一下吗),它们最终会以以下方式存储在内存中:

{128,1} [little] or {1,128} [big].

如果我在一台小端机器上,那么我应该再次颠倒每个字节中的位顺序,以恢复原始的位序列。能有人确认一下吗?

我不确定读取字节(位)的机器是否假设它们处于与机器本身相同的字节序。


2
你为什么要反转比特位呢?比特“只存在于”字节中,最高有效位始终保持不变。 - Thomas Jager
2
只有当位流通过串行管道(如调制解调器)传输时,才会存在字节序。 - Eljay
https://linux.die.net/man/3/byteorder - jo_
1
IBM主机将位从0(最高位)到31(最低位)进行编号,但这只是他们的惯例。将字节传输到主机时并没有交换位顺序,只是位的名称发生了变化。 - stark
重复的问题已经进行了编辑,最后一次编辑是:我找到了这篇文章(https://www.linuxjournal.com/article/6788),其中提到“位序通常遵循给定计算机系统的字节序”。这难道不支持我的说法吗?我正在阅读那个链接,但它不容易理解。正如某个评论中所说的那样,所有答案都很糟糕。 - NoComprende
显示剩余6条评论
1个回答

1
大小端只适用于2个或更大的整数(和浮点数)变量。它不适用于原始数据、uint8_t(字节)变量或uint8_t数组。

1
当使用union进行叠加时,位的字节序可以显示为位域成员的顺序。通常情况下,在C代码中位的字节序并不重要,但在串行通信中可能会有所影响。 - chux - Reinstate Monica
很不幸,对我来说,我特别感兴趣的是位域。我编写了一个 SQLite 函数,将字段打包到 blob 中,尽可能少地使用位数。它在我的小端笔记本电脑上运行得很好,但我一直无法找到所需的信息,使其在大端机器上运行。 - NoComprende

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接