这两个功能是否相同?

时间:2010-06-02 09:01:51

标签: c# integer byte

AES算法中有一个函数,在Galois域中将一个字节乘以2。

这是网站上提供的功能

private static byte gfmultby02(byte b)
    {
      if (b < 0x80)
        return (byte)(int)(b <<1);
      else
        return (byte)( (int)(b << 1) ^ (int)(0x1b) );
    }

这是我写的功能。

private static byte MulGF2(byte x)
            {
            if (x < 0x80)
                return (byte)(x << 1);
            else
            {
                return (byte)((x << 1) ^ 0x1b);

            }

}

我需要知道的是,给定任何字节是否会以相同的方式执行。实际上我担心额外的强制转换为int然后再次转换为byte。到目前为止,我已经测试过它看起来很好。在极少数情况下,额外强制转换为int然后再转换为字节会产生影响吗?

2 个答案:

答案 0 :(得分:2)

我认为在这种情况下,对int的施法无效,导致施放<=>在左移后。让我们举个例子:

byte b = 0x1000;

//temp1 == 0x00000000;
int temp1 = (int)(b << 1);
//temp2 == 0x00010000;
int temp2 = ((int)b) << 1);

因为您可以看到括号对结果有很大影响,但如果从网站上获取公式,您的代码应该表现相同。

答案 1 :(得分:1)

我认为这是正确的,但是:

确保最好的方法是简单地测试它;只有256个案例,编写测试用例不需要花费很多时间。