所以为了提供上下文,我的系统是小端的,而我正在读取的文件是大端的(对于感兴趣的人,MIDI格式)。我应该从文件中读取各种数据,包括无符号整数(8位、16位和32位)、字符和布尔值。
到目前为止,我知道读取无符号整数将是fread()的一个问题,因为我必须将它们从高字节转换为低字节。我的第一个问题是,尽管对某些人来说可能很愚蠢,但我是否也需要转换字符和布尔值?
我的第二个问题是关于整个文件格式的。由于文件在不同的字节顺序系统中,我是否需要从头到尾读取该文件(因为MSB和LSB位置将不同)?或者我需要像往常一样从头到尾读入这些值,然后将它们转换为小端?
感谢您花时间阅读我的帖子,并感谢您可能收到的任何答复!
发布于 2020-03-28 22:48:48
字节序只颠倒特定长度的字的顺序,通常是2、4或8个字节。如果您正在读入一个字节的值,比如char或bool,那么endianness没有任何影响。但是,如果您正在读入任何大于一个字节的值,比如一个整数,那么字节序很重要。你仍然可以使用fread,因为字节顺序与文件读取无关,只需确保从高字节顺序转换为低字节顺序即可。
发布于 2020-03-28 23:14:11
当您读取不仅仅是字符序列的外部数据时,您可以将其作为字节序列读取,并从中构造所需的实际数据。
如果您期望一个带符号的16位数字,然后是一个无符号的8位数字,然后是一个无符号的32位数字,那么您可以编写一个读取两个字节并将其转换为带符号的16位数字的函数,一个读取一个字节并将其作为无符号8位数字返回的函数,以及一个读取四个字节并将其转换为32位数字的函数。使用位移位构造16位和32位数字。
https://stackoverflow.com/questions/60901780
复制相似问题