C二进制文件的位字节序和可移植性

时间:2015-01-17 22:02:51

标签: c file endianness

在C中,我有一个char数组,用于在位级存储数据。我将这些数组存储到文件中,然后在具有不同体系结构的机器中读取它们。我的问题是如果比特的顺序保证一致吗?例如,如果我将“10010011”存储到第一个字节,那么相邻的1将始终​​被读取为2 ^ 0和2 ^ 1位置,或者它们最终可以解释为2 ^ 7和2 ^ 6位?

编辑:我想稍后为阅读本页的人澄清这个问题。字节字节顺序是多字节对象中字节的顺序,但我关心的是给定字节中的位。当一个字节存储到光盘时,它被存储为(通常)8位的序列。我不是硬件专家,但必须以某种方式归结为此。因此,我担心的是,如果存储字节的方式是任何机器将读取原始的unsigned char值,或者如果3到一台机器将是192到另一台机器。我担心这些比特最终会以某种方式洗牌。显然,根据我选择的答案以及下面的评论之一,这不是一个问题。感谢。

3 个答案:

答案 0 :(得分:1)

答案很简单:

这些位仍然是正确的顺序。

但是,如果执行超出%c的任何格式转换,例如%d,那么读取架构的字节顺序将决定字节顺序。每个字节中的位仍然是相同的。

答案 1 :(得分:0)

字节顺序是字节'顺序而不是位。因此,小端机器中的00001101在大端机器中将是相同的。但是,现在你应该在不同的机器上有关于位的顺序。比特在工会中的订单变更。如果您打算使用union,请阅读this以了解字节顺序如何影响位域打包。

答案 2 :(得分:0)

您尝试询问的概念称为bit-numbering or bit endianness,系统架构称为最低或最高有效位(MSB,LSB)排序。

据我所知,引用总是与第0位或第1位相关。

对于单个 8位字节或八位字节,它将是可移植的,这样字节的值将一直被认为是0x93(十进制147)。假设您正在将位串写为LSB表示,第0位是最右边的位(小端处理器的范数),通常由左到右的自然语言(如英语)的用户完成。