首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >请帮我弄清楚这个C#方法是做什么的?

请帮我弄清楚这个C#方法是做什么的?
EN

Stack Overflow用户
提问于 2010-06-27 02:58:30
回答 2查看 171关注 0票数 2

我对这种方法所完成的任务感到有点困惑。它似乎试图将字节分解成半字节,并将半字节与来自其他字节的半字节重新组合,以形成新的字节,然后返回新的字节序列。

然而,我不认为,你可以使用模数、减法和除法从一个字节中取出半字节,也不能用简单的乘法和加法重新组合它们。

我想更好地理解这个方法是如何工作的,以及它在做什么,这样我就可以获得一些关于它的注释,然后看看是否可以使用更标准的字节蚕食方法来转换它,以便更有意义,如果可能的话,甚至可以利用.Net 4.0。

代码语言:javascript
复制
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();
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-06-27 03:09:48

乘以2等同于将位向左移动一位。(所以乘以4就是移位2位,依此类推)。

除以2等同于将位向右移动一位。

模运算符用于掩码部分值。模数N,其中N= 2^p,将给出包含在原始值的(p-1)位中的值。所以

代码语言:javascript
复制
value % 4

都是一样的

代码语言:javascript
复制
value & 7    // 7 the largest value you can make with 3 bits (4-1). 4 + 2 +1.

可以使用加法和减法来组合这些值。例如,如果您知道n和z是4位值,则以下两个语句都会将它们合并为一个字节,n放在高4位:

代码语言:javascript
复制
value = (n * 16) + z;

对比

代码语言:javascript
复制
value = (n << 4) | z;
票数 3
EN

Stack Overflow用户

发布于 2010-06-27 03:10:49

我不能完全确定,但代码似乎正在重新排列每个字节中的半字节并翻转它们(因此0xF0变成了0x0F)。它可能正在尝试压缩或加密字节-如果没有代表性的输入,很难判断。

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

左移两次(>> 2)

  • Dividing除以16相同右移四次(>> 4)

  • Multiplying除以4相同左移两次(<< 2)

  • Multiplyingby 16相同左移四次(<< 4)

相同

  • 除以4

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

代码语言:javascript
复制
(byte)((16 * nibble1) + nibble2)

因此,如果nibble10x0Fnibble20x0C,则该操作将导致nibble1左移4,从而导致0xF0,然后添加nibble2,从而导致0xFF

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3125146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档