将字节数组(char数组)转换为整数类型(short,int,long)

Mik*_*ike 14 c++

我想知道在将字节数组转换为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_sntoh_l将有关字节序的决定卸载到socket知道这些事情的OS 实现.请注意,默认网络顺序是big endian(nin ntoh_x),因此将字节数组数据作为big endian将是最直接的方法.

正如OP(@Mike)所指出的,boost还提供了字节序转换功能.