2016-07-05 95 views
-3

我不是c中的古茹,我需要一些幫助。 我有這樣的代碼:不能將類型'int'隱式轉換爲'byte'。存在明確的轉換(你是否缺少一個轉換?)編譯

{ 
    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); 

已經嘗試讀一些其他的這個問題的答案府沒有運氣。 如果任何人可以幫助我瞭解什麼是錯的可能我知道如何解決它:)

任何幫助將不勝感激。

+7

至少知道您在使用哪種語言。 – LogicStuff

+2

作爲一個小問題:*通常*不是推出自己的加密/解密代碼的好主意,而是使用預先存在的衆所周知的(以及良好分析的)實現。 'expr_39'等在這裏讓我覺得你實際上是從某處反向工程... –

回答

3

事實上,在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); 

但只有你可以驗證那些。

+0

使用它並像一個魅力工作:)謝謝 –

0

不能使用byte存儲數量大於255:

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

然後你baseKey > 255,你必須聲明int變量來存儲數字。

3

如果您確信結果是在字節,則:

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

其他你需要改變baseKeybaseKey2int

Ranges低於:

字節:0至255

Int:-2,147,48 3,648 2,147,483,647

+0

使用'Convert'似乎在這裏大大地矯枉過正... –

0

中間計算使用一些int類型。你的結果太大,不能用字節表示。事情是你不能拿這些東西。

一個解決方案是實際執行顯式轉換(使用轉換運算符或Convert.ToByte函數)。

相關問題