fread 和 endianness 混乱
fread and endianness confusion
所以为了提供上下文,我的系统是小端,我正在读取的文件是大端(MIDI 格式,对于那些感兴趣的人)。我应该从文件中读取各种数据,包括无符号整数(8 位、16 位和 32 位)、字符和布尔值。
到目前为止,我知道读取无符号整数将是 fread() 的一个问题,因为我必须将它们从大端转换为小端。我的第一个问题是,虽然对某些人来说可能很愚蠢,但我是否也需要转换字符和布尔值?
我的第二个问题是关于整个文件格式的。由于文件在不同的字节序系统中,我是否需要从头到尾读取文件(因为 MSB 和 LSB 位置会不同)?或者我是否需要像往常一样从头到尾读取值,然后将它们转换为小端?
感谢您花时间阅读我的 post 以及我可能收到的任何答复!
字节序仅颠倒特定长度(通常为 2、4 或 8 个字节)的字内的顺序。如果您读入的是单字节值,例如 char 或 bool,则字节顺序无效。但是,如果您正在读取超过一个字节的任何值,例如整数,那么字节顺序很重要。您仍然可以使用 fread
,因为字节顺序与文件读取无关,只需确保从大端转换为小端。
当您读取不只是字符序列的外部数据时,您将其作为字节序列读取,并从中构建您想要的实际数据。
如果您需要一个带符号的 16 位数字,后跟一个无符号的 8 位数字,然后是一个无符号的 32 位数字,您可以编写一个函数读取两个字节并将它们 returns 转换为带符号的 16 位数字,一个读取一个字节并将其 returns 作为无符号 8 位数字,一个读取四个字节并将其 returns 转换为 32 位数字。使用位移构造 16 位和 32 位数字。
所以为了提供上下文,我的系统是小端,我正在读取的文件是大端(MIDI 格式,对于那些感兴趣的人)。我应该从文件中读取各种数据,包括无符号整数(8 位、16 位和 32 位)、字符和布尔值。
到目前为止,我知道读取无符号整数将是 fread() 的一个问题,因为我必须将它们从大端转换为小端。我的第一个问题是,虽然对某些人来说可能很愚蠢,但我是否也需要转换字符和布尔值?
我的第二个问题是关于整个文件格式的。由于文件在不同的字节序系统中,我是否需要从头到尾读取文件(因为 MSB 和 LSB 位置会不同)?或者我是否需要像往常一样从头到尾读取值,然后将它们转换为小端?
感谢您花时间阅读我的 post 以及我可能收到的任何答复!
字节序仅颠倒特定长度(通常为 2、4 或 8 个字节)的字内的顺序。如果您读入的是单字节值,例如 char 或 bool,则字节顺序无效。但是,如果您正在读取超过一个字节的任何值,例如整数,那么字节顺序很重要。您仍然可以使用 fread
,因为字节顺序与文件读取无关,只需确保从大端转换为小端。
当您读取不只是字符序列的外部数据时,您将其作为字节序列读取,并从中构建您想要的实际数据。
如果您需要一个带符号的 16 位数字,后跟一个无符号的 8 位数字,然后是一个无符号的 32 位数字,您可以编写一个函数读取两个字节并将它们 returns 转换为带符号的 16 位数字,一个读取一个字节并将其 returns 作为无符号 8 位数字,一个读取四个字节并将其 returns 转换为 32 位数字。使用位移构造 16 位和 32 位数字。