如何以通用方式读取原始文件(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;
可能只是一个愚蠢的问题...
我正在用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;
可能只是一个愚蠢的问题...