0

此表达式取自 Leptonica(图像处理库)中的内置函数“l_setDataByte”。

这是链接:http ://tpgit.github.io/Leptonica/arrayaccess_8c_source.html (此处为第 260 行)

*(l_uint8 *)((l_uintptr_t)((l_uint8 *)line + n) ^ 3) = val;
4

1 回答 1

0

我猜:

  • 行是指向无符号 8 位(字节)的指针(l_uint8 *)line
  • 操作行中的第 n 个字节: (l_uint8 *)line + n --> y(y 是指针)
  • 但是,在转换为非单整数指针后,还会对地址的最后 2 位进行异或:(l_uintptr_t)y ^ 3--> z(z 是指针)
  • 最后一个转换回无符号字节点并将值写入val那里:*(l_uint8 *)z = val

编辑: ^3 是为了解决字节的排列(即小端与大端)。数字 0x12345678 可以通过两种方式放入连续字节中:0x12、0x34、0x56、0x78(这是大端)或 0x78、0x56、0x34、0x12(小端)。XOR 将从大端寻址(见第 274 行)切换到小端寻址(第 276 行)。这取决于处理器,源代码以一种或另一种方式编译。

于 2013-08-01T15:45:59.937 回答