这到底是做什么的?-疯狂的c++函数

What does this actually do? - Crazy C++ function

本文关键字:c++ 函数 疯狂 什么      更新时间:2023-10-16

我正在处理一些遗留代码,并且我遇到了一个函数,它显然用于在任意长的字段(大于ntohl可以处理的)上执行网络字节顺序转换。

我不能很好地理解它,以判断它是否在做比在msg缓冲区范围内反转字节顺序更多的事情(或者即使它会可靠地做到这一点)。有人能帮我分解和分析它,这样我就可以用更容易理解的东西来代替它(或者至少评论好)!

void swapit(unsigned char *msg, int length) {
  for(;length>0;length--, msg++) {
    *msg = ((*msg * 0x0802LU & 0x22110LU) |
            (*msg * 0x8020LU & 0x88440LU)) *
           0x10101LU >> 16;
  }
}

要了解它是如何工作的,请考虑将这些操作应用于位模式abcdefgh。我将用.表示0的二进制数,这样非零位就会突出。

第一个子表达式是:

  ........ ........ abcdefgh
* ........ ....1... ......1. (0x0802)
= .....abc defgh..a bcdefgh.
& ......1. ..1....1 ...1.... (0x22110)
= ......b. ..f....a ...e....

第二个是:

  ........ ........ abcdefgh
* ........ 1....... ..1..... (0x8020)
= .abcdefg h..abcde fgh.....
& ....1... 1....1.. .1...... (0x88440)
= ....d... h....c.. .g......

将它们组合并乘以最后的常数得到:

  ......b. ..f....a ...e....
| ....d... h....c.. .g......
= ....d.b. h.f..c.a .g.e....
* .......1 .......1 .......1 (0x10101)
= ....d.b. h.f..c.a .g.e....
 +h.f..c.a .g.e.... ........
 +.g.e.... ........ ........
= hgfedcba hgfe.c.a .g.e....

最后向下移动16位得到hgfedcba,与原始模式相反。

从这个问题:C语言中比特反转(从MSB->LSB到LSB->MSB)的最佳算法

似乎是反转位。

0010 0000 => 0000 0100

在位篡改技巧中提到,通过7次操作反转字节中的位(不包括64位)