C语言 fread and endianness confusion



因此,为了提供上下文,我的系统是小端序,而我正在读取的文件是大端序(MIDI格式,对于感兴趣的人来说(。我应该从文件中读取各种数据,包括无符号整数(8位、16位和32位(、字符和布尔值。

到目前为止,我知道fread((读取无符号整数将是一个问题,因为我必须将它们从big-endian转换为little-endian。我的第一个问题是,虽然对一些人来说可能很愚蠢,但我也需要转换字符和布尔值吗?

我的第二个问题是关于整个文件格式。由于该文件位于不同的endian系统中,我是否需要从头到尾读取该文件(因为MSB和LSB的位置不同(?或者我需要像往常一样从头到尾读取值,然后将其转换为小端序吗?

感谢你花时间阅读我的帖子以及我可能收到的任何答案!

Endianness只在特定长度的单词内反转顺序,通常为2、4或8个字节。如果您正在读取一个单字节的值,如char或bool,那么endianness没有任何作用。但是,如果您读取的值超过一个字节,例如一个整数,那么endianness很重要。您仍然可以使用fread,因为endianness与文件读取无关,只需确保从big-endian转换为little-endian即可。

当您读取不仅仅是字符序列的外部数据时,您将其读取为字节序列,并从中构建您想要的实际数据。

如果您期望一个有符号的16位数字,后面跟着一个无符号的8位数字,然后跟着一个没有符号的32位数字,那么您编写一个读取两个字节并将其转换为有符号16位数字的函数,一个读取一个字节并以无符号8位数字的形式返回,另一个读取四个字节并返回转换为32位数字的字节。使用位移位构造16位和32位数字。

最新更新