如何以通用方式读取原始文件(小/大端)?

时间:2016-08-01 15:41:13

标签: file generics architecture endianness

我正在用C ++写一个RawFile类(这里的语言并不重要)。但是,无论编译的CPU是什么,我都希望保持库完全通用。

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

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

目前,我决定使用以下测试:

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

我假设下表:

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

但是,我不确定这是否正确,我可能会遗漏一些东西。

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

1 个答案:

答案 0 :(得分:0)

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

事实上,我意识到我正在读取每个字节的文件字节(在“原始模式”下)。因此,系统本身是小端或大端的事实是无关紧要的。您只需要考虑您读取的文件类型以重新排序(或不重新)您正在阅读的字节集...所以,测试只是:

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

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