如何以通用方式读取原始文件(little/big 字节序)?

How to read raw files in a generic manner (little/big endian)?

我正在用C++写一个RawFile class(这里语言无关紧要)。但是,我想让这个库完全通用,无论它是为 CPU 编译的。

现在,我有一个 uint16_t swap16(uint16_t value) 函数交换两个字节和 return 一个无符号整数和一个 bool is_bigendian() 函数 return true如果系统是 big-endian,否则 false(我决定忽略 PDP-11 字节排序方案,因为它不太可能遇到)。最后,我得到了我正在阅读的原始文件的字节顺序。

问题如下,给定文件和系统的字节顺序信息,如何决定是否应用swap16()函数?

现在,我决定使用以下测试:

return (file_is_big_endian || system_is_big_endian) ? swap16(value) : value;

我假设如下 table:

sytem\rawfile | little-endian | big-endian |
--------------------------------------------
little-endian |   No swap16() |  swap16()  |
   big-endian |    swap16()   |  swap16()  |

但是,我不确定这是否正确,我可能遗漏了什么。

欢迎任何好的解释(或更好的测试)!

我回答我自己的问题...

事实上,我意识到我正在逐字节读取文件(在 "raw mode" 中)。因此,系统本身是小端还是大端这一事实是无关紧要的。您只需要考虑您读取的文件类型即可重新排序(或不重新排序)您正在读取的字节集...因此,测试很简单:

return (file_is_big_endian) ? swap16(value) : value;

可能只是一个愚蠢的问题...