C 二进制文件的位字节顺序和可移植性
bit endianness and portability of C binary files
在 C 中,我有一个 char 数组,用于在位级别存储数据。我将这些数组存储到文件中,然后在具有不同体系结构的机器中读取它们。我的问题是位的顺序是否能保证一致?例如,如果我将“10010011”存储到第一个字节,相邻的 1 是否总是被读取为位于 2^0 和 2^1 位置,或者它们最终会被解释为 2^7 和 2^6 位?
编辑:我想为稍后阅读此页面的人澄清一下这个问题。字节顺序是多字节对象中字节的顺序,但我关心的是给定字节中的位。当一个字节存储到磁盘时,它存储为(通常)8 位的序列。我不是硬件专家,但它必须以某种方式归结为那个。所以,我担心的是字节的存储方式是不是任何机器都会读取原始的 unsigned char 值,或者如果一台机器是 3,那么另一台机器是 192。我担心这些位最终会以某种方式被洗牌。显然,根据我选择的答案以及下面的评论之一,这不是问题。谢谢。
简单的答案:
位的顺序仍然正确。
但是,如果执行超过 %c 的任何格式转换,例如 %d,则读取架构的字节顺序将决定字节顺序。每个字节中的位仍然相同。
字节顺序是关于字节的顺序而不是位。因此,小端机器中的 00001101 与大端机器中的相同。但是,您现在应该了解不同机器中位的顺序。联合中位的顺序变化。如果您要使用联合,请阅读 this 以了解字节顺序如何影响位域打包。
您要询问的概念称为 bit-numbering or bit endianness,系统架构称为最低或最高有效位(MSB、LSB)排序。
据我所知,参考总是关于第 0 位或第 1 位位置。
关于单个 8 位字节或八位字节,它将是可移植的,这样字节的值将始终被视为 0x93(十进制 147) .假设您将位串写为 LSB 表示形式,其中第 0 位是最右边的位(小端处理器的标准),就像英语等从左到右的自然语言的用户通常所做的那样。
在 C 中,我有一个 char 数组,用于在位级别存储数据。我将这些数组存储到文件中,然后在具有不同体系结构的机器中读取它们。我的问题是位的顺序是否能保证一致?例如,如果我将“10010011”存储到第一个字节,相邻的 1 是否总是被读取为位于 2^0 和 2^1 位置,或者它们最终会被解释为 2^7 和 2^6 位?
编辑:我想为稍后阅读此页面的人澄清一下这个问题。字节顺序是多字节对象中字节的顺序,但我关心的是给定字节中的位。当一个字节存储到磁盘时,它存储为(通常)8 位的序列。我不是硬件专家,但它必须以某种方式归结为那个。所以,我担心的是字节的存储方式是不是任何机器都会读取原始的 unsigned char 值,或者如果一台机器是 3,那么另一台机器是 192。我担心这些位最终会以某种方式被洗牌。显然,根据我选择的答案以及下面的评论之一,这不是问题。谢谢。
简单的答案:
位的顺序仍然正确。
但是,如果执行超过 %c 的任何格式转换,例如 %d,则读取架构的字节顺序将决定字节顺序。每个字节中的位仍然相同。
字节顺序是关于字节的顺序而不是位。因此,小端机器中的 00001101 与大端机器中的相同。但是,您现在应该了解不同机器中位的顺序。联合中位的顺序变化。如果您要使用联合,请阅读 this 以了解字节顺序如何影响位域打包。
您要询问的概念称为 bit-numbering or bit endianness,系统架构称为最低或最高有效位(MSB、LSB)排序。
据我所知,参考总是关于第 0 位或第 1 位位置。
关于单个 8 位字节或八位字节,它将是可移植的,这样字节的值将始终被视为 0x93(十进制 147) .假设您将位串写为 LSB 表示形式,其中第 0 位是最右边的位(小端处理器的标准),就像英语等从左到右的自然语言的用户通常所做的那样。