我对这种方法所完成的任务感到有点困惑。它似乎试图将字节分解成半字节,并将半字节与来自其他字节的半字节重新组合,以形成新的字节,然后返回新的字节序列。
然而,我不认为,你可以使用模数、减法和除法从一个字节中取出半字节,也不能用简单的乘法和加法重新组合它们。
我想更好地理解这个方法是如何工作的,以及它在做什么,这样我就可以获得一些关于它的注释,然后看看是否可以使用更标准的字节蚕食方法来转换它,以便更有意义,如果可能的话,甚至可以利用.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();
}发布于 2010-06-27 03:09:48
乘以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;发布于 2010-06-27 03:10:49
我不能完全确定,但代码似乎正在重新排列每个字节中的半字节并翻转它们(因此0xF0变成了0x0F)。它可能正在尝试压缩或加密字节-如果没有代表性的输入,很难判断。
关于函数中发生的不同事情:
左移两次(>> 2)
>> 4)
<< 2)
<< 4)相同
这些部分从半字节重建一个字节,第一个半字节放在较高的位置,第二个放在较低的位置:
(byte)((16 * nibble1) + nibble2)因此,如果nibble1为0x0F,nibble2为0x0C,则该操作将导致nibble1左移4,从而导致0xF0,然后添加nibble2,从而导致0xFF。
https://stackoverflow.com/questions/3125146
复制相似问题