我对这种方法所取得的成就感到有些困惑。它似乎试图将字节分成半字节并用其他字节的半字节重新组装半字节以形成新字节,然后返回一个新的字节序列。
但是,我没想到,你可以使用模数和减法以及除法从字节中取出半字节,也不用简单的乘法和加法重组它们。
我想更好地理解这个方法是如何工作的,以及它在做什么,所以我可以围绕它做一些评论然后看看是否可以使用更多标准方法来转换为更有意义如果可能,请利用.Net 4.0。
private static byte[] Process(byte[] bytes)
{
Queue<byte> newBytes = new Queue<byte>();
int phase = 0;
byte nibble1 = 0;
byte nibble2 = 0;
byte nibble3 = 0;
int length = bytes.Length-1;
for (int i = 0; i < length; i++)
{
switch (phase)
{
case 0:
nibble1 = (byte)((bytes[i] - (bytes[i] % 4)) / 4);
nibble2 = (byte)(byte[i] % 4);
nibble3 = 0;
break;
case 1:
nibble2 = (byte)((nibble2 * 4) + (bytes[i] - (bytes[i] % 16))/16);
nibble3 = (byte)(bytes[i] % 16);
if (i < 4)
{
newBytes.Clear();
newBytes.Enqueue((byte)((16 * nibble1) + nibble2));
}
else
newBytes.Enqueue((byte)((16 * nibble1) + nibble2));
break;
case 2:
nibble1 = nibble3;
nibble2 = (byte)((bytes[i] - (bytes[i] % 4)) / 4);
nibble3 = (byte)(bytes[i] % 4);
newBytes.Enqueue((byte)((16 * nibble1) + nibble2));
break;
case 3:
nibble1 = (byte)((nibble3 * 4) + (bytes[i] - (bytes[i] % 16))/16);
nibble2 = (byte)(bytes[i] % 16);
newBytes.Enqueue((byte)((16 * nibble1) + nibble2));
break;
}
phase = (phase + 1) % 4;
}
return newBytes.ToArray();
}
答案 0 :(得分:3)
乘以2与向左移位一位相同。 (因此乘以4会移动2个位置,依此类推。)
除以2与向右移位一位相同。
模数运算符用于屏蔽部分值。模数N,其中N = 2 ^ p,将给出原始值的(p-1)位中包含的值。所以
value % 4
与
相同value & 7 // 7 the largest value you can make with 3 bits (4-1). 4 + 2 +1.
可以使用加法和减法来组合这些值。例如,如果您知道n和z为4位值,则以下两个语句将它们组合成一个字节,n位于高4位:
value = (n * 16) + z;
对战
value = (n << 4) | z;
答案 1 :(得分:2)
我不完全确定,但代码似乎是重新排列每个字节中的半字节并翻转它们(因此0xF0
变为0x0F
)。它可能试图压缩或加密字节 - 没有代表性的输入很难说。
关于函数中发生的不同事情:
>> 2
)>> 4
)<< 2
)<< 4
)这些部分从半字节重建一个字节,第一个半字节放在高阶部分,第二个放在低阶部分:
(byte)((16 * nibble1) + nibble2)
因此,如果nibble1
为0x0F
且nibble2
为0x0C
,则操作会导致nibble1
的左移4,导致{{1然后添加0xF0
,结果为nibble2
。