无法隐式转换类型' int'到'字节'。编译时存在显式转换(您是否错过了转换?)

时间:2016-07-05 10:15:54

标签: c#

我不是c的大师,我需要一些帮助。 我有这段代码:

{
    private ushort InCounter;

    private ushort OutCounter;

    private byte[] cipherKey1 = new byte[256];

    private byte[] cipherKey2 = new byte[256];

    public AuthCipher()
    {
        byte baseKey = 157;
        byte baseKey2 = 98;
        for (int i = 0; i < 256; i++)
        {
            this.cipherKey1[i] = baseKey;
            this.cipherKey2[i] = baseKey2;
            baseKey = (15 + baseKey * 250) * baseKey + 19;
            baseKey2 = (121 - baseKey2 * 92) * baseKey2 + 109;
        }
        this.InCounter = 0;
        this.OutCounter = 0;
    }

    public unsafe void Encrypt(byte* src, int srcOffset, byte[] dst, int dstOffset, int length)
    {
        fixed (byte* pDst = &dst[dstOffset])
        {
            for (int i = srcOffset; i < srcOffset + length; i++)
            {
                pDst[i] = (src[i] ^ 171);
                pDst[i] = (byte)(pDst[i] >> 4 | (int)pDst[i] << 4);
                byte* expr_39 = pDst + i;
                *expr_39 ^= this.cipherKey2[this.InCounter >> 8];
                byte* expr_51 = pDst + i;
                *expr_51 ^= this.cipherKey1[(int)(this.InCounter & 255)];
                this.InCounter += 1;
            }
        }
    }

    public unsafe void Decrypt(byte[] src, int srcOffset, byte* dst, int dstOffset, int length)
    {
        fixed (byte* pSrc = &src[srcOffset])
        {
            for (int i = dstOffset; i < dstOffset + length; i++)
            {
                dst[i] = (pSrc[i] ^ 171);
                dst[i] = (byte)((int)dst[i] << 4 | dst[i] >> 4);
                byte* expr_35 = dst + i;
                *expr_35 ^= this.cipherKey2[this.OutCounter >> 8];
                byte* expr_4C = dst + i;
                *expr_4C ^= this.cipherKey1[(int)(this.OutCounter & 255)];
                this.OutCounter += 1;
            }
        }
    }
}

弹出错误:

baseKey = (15 + baseKey * 250) * baseKey + 19;
            baseKey2 = (121 - baseKey2 * 92) * baseKey2 + 109;

pDst[i] = (src[i] ^ 171);
dst[i] = (pSrc[i] ^ 171);

已经尝试过阅读这个问题的其他答案但没有运气。 如果任何人可以帮助我理解什么是错的可能我知道如何解决它:)

任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:4)

事实上,在C#(而不是C)中,byte上的大多数操作的结果(矛盾的是,但它确实有意义)int。这意味着您需要回退到byte,但是您需要考虑舍入行为等应该是什么。一个天真的修复方法是:

baseKey = (byte)((15 + baseKey * 250) * baseKey + 19);
baseKey2 = (byte)((121 - baseKey2 * 92) * baseKey2 + 109);
...
pDst[i] = (byte)(src[i] ^ 171);
...
dst[i] = (byte)(pSrc[i] ^ 171);

但只有你可以验证这些。

答案 1 :(得分:3)

如果你确定结果在字节中,那么:

baseKey = Convert.ToByte((15 + baseKey * 250) * baseKey + 19);
baseKey2 = Convert.ToByte((121 - baseKey2 * 92) * baseKey2 + 109);

否则您需要将baseKeybaseKey2更改为int

Ranges如下:

  

字节:0到255

     

Int:-2,147,483,648至2,147,483,647

答案 2 :(得分:0)

您不能使用byte来存储大于255的数字:

baseKey = (15 + baseKey * 250) * baseKey + 19;
baseKey2 = (121 - baseKey2 * 92) * baseKey2 + 109;

然后是您的baseKey > 255,您已声明int变量来存储该号码。

答案 3 :(得分:0)

中间计算使用某种int类型。此外,您的结果太大,无法以字节表示。问题是你不能这样拿东西。

一种解决方案是实际执行显式转换(使用强制转换运算符或Convert.ToByte函数)。