【发布时间】:2010-06-27 03:42:37
【问题描述】:
我对这种方法所完成的工作有点困惑。它似乎试图将字节分解成半字节,并将半字节与其他字节的半字节重新组合以形成新字节,然后返回一个新的字节序列。
但是,我不认为,您可以使用模数、减法和除法从一个字节中取出半字节,也不能通过简单的乘法和加法重新组合它们。
我想更好地理解这个方法是如何工作的,以及它在做什么,所以我可以在它周围找到一些 cmets,然后看看它是否可以使用更标准的蚕食字节方法转换成更有意义的方法,甚至尽可能利用 .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();
}
【问题讨论】:
-
请注意 - 除以 4 与
>> 2相同,除以 16 与>> 4相同。乘以它们是同一种左移。 -
Gnome -
i < 4在前 4 次传递(前四个字节)期间为真。因此,它似乎丢弃了前 4 个结果。 -
打开一个单独维护的相位变量而不是仅仅打开 i 的 mod 是第一个迹象表明这段代码的其余部分可能正在以困难的方式做事。
-
@Oded 您的答案和@driis 一样正确,所以很难选择,所以我根据他的回答先选择了。我喜欢这两个答案,他们非常有帮助,谢谢你们。