我想知道在将字节数组转换为short/int/long时系统字节顺序是否重要.如果代码在big-endian和little-endian机器上运行,这会不正确吗?
short s = (b[0] << 8) | (b[1]);
int i = (b[0] << 24) | (b[1] << 16) | (b[2] << 8) | (b[3])
Run Code Online (Sandbox Code Playgroud)
Eli*_*ser 19
是的,字节序很重要.在little endian中,你在short或int的上半部分中有最重要的字节 - 即8-15位为short,24-31为int.对于大端,字节顺序需要反转:
short s = ((b[1] << 8) | b[0]);
int i = (b[3] << 24) | (b[2] << 16) | (b[1] << 8) | (b[0]);
Run Code Online (Sandbox Code Playgroud)
请注意,这假设字节数组是小端序.字节数组和整数类型之间的字节顺序和转换不仅取决于CPU的字节顺序,还取决于字节数组数据的字节顺序.
建议将这些转换包装在将知道(通过编译标志或在运行时)系统的字节顺序并正确执行转换的函数中.
此外,为字节数组数据创建一个标准(例如,总是大端),然后使用socket ntoh_s和ntoh_l将有关字节序的决定卸载到socket知道这些事情的OS 实现.请注意,默认网络顺序是big endian(nin ntoh_x),因此将字节数组数据作为big endian将是最直接的方法.
正如OP(@Mike)所指出的,boost还提供了字节序转换功能.
| 归档时间: |
|
| 查看次数: |
35280 次 |
| 最近记录: |