请帮忙弄清楚这个C#方法在做什么?

时间:2010-06-26 18:58:30

标签: c# .net-4.0 byte

我对这种方法所取得的成就感到有些困惑。它似乎试图将字节分成半字节并用其他字节的半字节重新组装半字节以形成新字节,然后返回一个新的字节序列。

但是,我没想到,你可以使用模数和减法以及除法从字节中取出半字节,也不用简单的乘法和加法重组它们。

我想更好地理解这个方法是如何工作的,以及它在做什么,所以我可以围绕它做一些评论然后看看是否可以使用更多标准方法来转换为更有意义如果可能,请利用.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();
}

2 个答案:

答案 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)。它可能试图压缩或加密字节 - 没有代表性的输入很难说。

关于函数中发生的不同事情:

  • 除以4与右移两次(>> 2
  • 相同
  • 除以16是相同的右移四次(>> 4
  • 乘以4是两次移位(<< 2
  • 乘以16是相同的四次移位(<< 4

这些部分从半字节重建一个字节,第一个半字节放在高阶部分,第二个放在低阶部分:

(byte)((16 * nibble1) + nibble2)

因此,如果nibble10x0Fnibble20x0C,则操作会导致nibble1的左移4,导致{{1然后添加0xF0,结果为nibble2