char* buf = read(); // let buf be a pointer to the read buffer
uint32_t v;
// little to native
v = 0;
for(unsigned i = 0; i < sizeof v; i++)
v |= buf[i] << CHAR_BIT * i;
// big to native
v = 0;
for(unsigned i = 0; i < sizeof v; i++)
v |= buf[i] << CHAR_BIT * (sizeof v - i);
2 回答
考虑到您正在从文件中读取数据这一事实,与文件IO相比,切换字节序的方式对运行时的影响不大 .
可能会产生重大影响的是您如何阅读数据 . 试图不按顺序读取字节不是一个好主意 . 只需按顺序读取字节,然后切换字节顺序 . 这将读取和字节交换分开 .
我通常希望从字节交换代码,当然在读取文件的情况下,它适用于任何字节序,并且不依赖于架构特定的指令 .
这适用于本机是大型,小型还是中等端种类之一 .
当然,boost已经为您实现了这些,因此无需重新实现 . 此外,POSIX和windows C库都提供了ntoh?系列函数,可用于将大端转换为/从本机转换 .
不是最快的,但可移植的方法是将文件读入(unsigned)int数组,将int数组别名为char(允许每个严格的别名规则)并在内存中交换字节 .
完全便携的方式:
但如果您不需要可移植性,某些系统会提供交换功能 . 例如,BSD系统有
bswap16
,bswap32
和bswap64
分别在uint16_t
,uint32_t
和uint_64_t
中交换字节 . 毫无疑问,Microsoft或GNU-Linux世界中存在等效函数 .或者,如果您知道该文件是网络顺序(大端)而您的处理器不是,则可以分别使用
ntohs
和ntohl
函数uint16_t
和uint32_t
.备注(根据AndrewHenle的评论):无论主机端是什么,始终可以使用
ntohs
和ntohl
- 只是它们在大端系统上是无操作的