这个endian转换如何工作?

时间:2016-07-01 17:51:13

标签: c-preprocessor endianness qnx

名为gfpr.h的QNX库包含行

#define ENDIAN_LE16(__x)    (__x)

使用如下

var1 = ENDIAN_LE16(var1);

转换(unsigned short)var1的字节顺序。这是如何运作的? __xx__必须对预处理器有一些特殊含义吗?

1 个答案:

答案 0 :(得分:2)

__x没有特殊含义。 ENDIAN_LE16是一个宏,可以在不更改源代码的情况下更改字节序。每个构建目标可以具有针对该目标的不同版本的gfpr.h

您必须为小端机器进行编译,因此ENDIAN_LE16不需要进行任何更改。它只是保持其参数(__x)不变。如果您正在编译big-endian目标,则会定义ENDIAN_LE16来交换其参数的字节。类似的东西:

#define ENDIAN_LE16(__x) ( (((x) & 0xff) << 8) | (((x) >> 8) & 0xff) )

这样,通过更改您添加的目标文件gfpr.h,即可获得正确的结果,而无需更改源代码。

修改根据file you're probably looking atENDIAN_BE32调用ENDIAN_RET32,这会以类似于我上面显示的方式对比特进行分解。