我正在用C++编写一个RawFile
类(这里的语言无关紧要)。但是,无论编译该库的CPU是什么,我都希望它完全通用。
目前,我有一个uint16_t swap16(uint16_t value)
函数,它交换两个字节并返回一个无符号整数,还有一个bool is_bigendian()
函数,如果系统处于big-endian,则返回true
,否则返回false
(我决定忽略PDP-11字节排序方案,因为它不太可能遇到)。最后,我得到了正在读取的原始文件的endianness。
问题如下,给定文件和系统的端序信息,我如何决定是否应用swap16()
函数?
目前,我决定使用以下测试:
return (file_is_big_endian || system_is_big_endian) ? swap16(value) : value;
我假设下表:
sytemrawfile | little-endian | big-endian |
--------------------------------------------
little-endian | No swap16() | swap16() |
big-endian | swap16() | swap16() |
但是,我真的不确定这是否正确,我可能遗漏了一些东西。
欢迎任何好的解释(或更好的测试)!
我回答自己的问题。。。
事实上,我意识到我正在以字节为单位读取文件(在"原始模式"中)。因此,系统本身是小端序或大端序这一事实是无关紧要的。你只需要考虑你读取的文件的类型,就可以重新排序(或不排序)你正在读取的字节集。。。因此,测试很简单:
return (file_is_big_endian) ? swap16(value) : value;
可能只是个愚蠢的问题。。。