当对使用位移操作的 C 代码进行逆向工程时,我对下面的代码逆向操作背后的方法感到困惑。
unsigned char red = 37;
unsigned char blue = 100;
unsigned char green = 77
unsigned short us = (red << 8) + (blue);
us = (us << 5 ) | (us >> 11);
unsigned int threebytes = (us << 8) + green;
由于 NOT 是反转位的操作,我假设我可以实现 NOT 来反转每行或代码末尾的位,但是,我的结果与导致我的预期输出不匹配相信我已经陷入了误会。我对逆向工程有什么不明白的地方?
最佳答案
这似乎是理解 C 位运算的类练习。它似乎进一步假设 unsigned char
是八位和 unsigned short
是 16 位,很可能 unsigned int
是32位的。您在本练习中的工作是了解哪些位被移动到何处,并设计新的操作,将这些位从 threebytes
中的结果值移动。返回到三个单独变量中的原始值。
以下是理解代码的一些帮助:
unsigned short us = (red << 8) + (blue);
此代码改变 red
的值左(高)八位并放入 blue
的值在低八位。
us = (us << 5 ) | (us >> 11);
这实际上执行了位循环。假设我们将 16 位标记为 us
以便我们可以跟踪它们:
fedcba9876543210
表达式us << 5
以 16 位生成(由于 C 规则,中间结果实际上有 32,但高 16 稍后将被丢弃,因此我们忽略它们):
a9876543210_____
下划线表示移入的新 0 位。其他数字是先前位值的标签。
表达式us >> 11
产生这个:
___________fedcb.
当这些与 |
组合时在(us << 5) |
(us >> 11)`,结果是:
a9876543210fedcb
因此,原始位 fedcba9876543210
已旋转为 a9876543210fedcb
.
然后这个:
unsigned int threebytes = (us << 8) + green
从 us
移动 16 位留下八位并插入 green
的值在低八位。
由此,您应该能够理解red
中的所有位在哪里。 , blue
,和green
最终为 threebytes
。然后练习就是编写新代码,将这些位从 threebytes
移走。回到单独的变量。
关于c - 如何在 C 中实现移位运算的逆运算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55443215/