我正在用购买的一些教科书自学 C。一般来说,这非常容易,但我不太容易掌握的一个领域与位操作有关。我从字面(孤立)的意义上理解运算符的使用,但不太了解它们在下面的特定上下文中的应用方式。
下面有 2 个这样的例子,我无法理解它们在某些解密算法的背景下如何/做什么。
我所寻找的只是对十六进制和位移位/左右移动将一起执行的操作的一些解释。
我在网上浏览的大多数示例都是孤立的,到目前为止还没有完全理解它们在这种情况下的应用方式。
如果有任何人都可以推荐的专门针对位操作/操作的教科书,我也愿意投资这些信息。这就是我真正确定这一点的决心(我讨厌在没有完全掌握某些东西的情况下继续前进)。
unsigned long lBits = 0;
lBits = ((unsigned long)(key[28] & 0xFFFF)<< 24)|
((unsigned long)(key[29] & 0xFFFF)<< 16)|
((unsigned long)(key[30] & 0xFFFF)<< 8)|
((unsigned long)(key[31] & 0xFFFF));
...
for(i=0; i < max_length ; i++){
unsigned long tBits = lBits | i;
tkey[28] = (unsigned char) (tBits >> 24);
tkey[29] = (unsigned char) (tBits >> 16);
tkey[30] = (unsigned char) (tBits >> 8);
tkey[31] = (unsigned char) (tBits);
最佳答案
让我们逐行分解:
unsigned long lBits = 0;
lBits = ((unsigned long)(key[28] & 0xFFFF)<< 24)|
((unsigned long)(key[29] & 0xFFFF)<< 16)|
((unsigned long)(key[30] & 0xFFFF)<< 8)|
((unsigned long)(key[31] & 0xFFFF));
一开始这很令人困惑。乍一看,它似乎试图读取从 key[28]
开始的大端 32 位整数。然而,由于掩码是 0xFFFF(16 位),而不是典型 8 位掩码的预期 0xFF,因此这不是实际效果。实际发生的情况是 key
的字节实际上被或运算在一起形成 32 位长。由于缺乏上下文,很难准确地说出这应该实现什么。我想它可能会将 key 的各个位混合在一起以形成“圆形 key ”或类似的东西。
for(i=0; i < max_length ; i++){
unsigned long tBits = lBits | i;
tkey[28] = (unsigned char) (tBits >> 24);
tkey[29] = (unsigned char) (tBits >> 16);
tkey[30] = (unsigned char) (tBits >> 8);
tkey[31] = (unsigned char) (tBits);
这样就比较清楚了。它只是简单地写tBits | i
到 tkey[28]
(大端格式)。
实际上,这是循环遍历 i
中的所有位组合,并将它们写入从 key[28]
开始的 32 位。我认为循环体的其余部分对这些位做了一些事情。
关于c - C 中的位运算/操作 - 解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38175075/