2013-12-10 35 views
2

嗨我想查找單個字符串的校驗和。這裏是校驗和的要求。在C#中找到一個字符串的校驗和.net

  1. 以十六進制字符表示的32位/ 8字節校驗和。
  2. 它應該是頭+會話+ body +消息的XOR。

讓我們假設header + session + body + message =「這是測試字符串」。我想計算這個的校驗和。到目前爲止,我開發了下面的代碼。

校驗計算正確如果string length(byte[] data)是4

倍數。如果「數據」不是4的倍數我接收異常作爲

「System.IndexOutOfRangeException:索引的邊界之外陣列「。

我將從用戶採取不同字符串長度的輸入,因此字符串長度將是可變的(意味着某些時間用戶只能輸入ABCDE幾次q和A等)。我怎樣才能解決這個問題,除了計算和校驗正確與4

public string findchecksum(string userinput) 
    try 
    { 
     ASCIIEncoding enc = new ASCIIEncoding(); 

     byte[] data = Encoding.ASCII.GetBytes(userinput); 
     byte[] checksum = new byte[4]; 
     for (int i = 16; i <= data.Length - 1; i += 4) 
     { 


      checksum[0] = (byte)(checksum[0]^data[i]); 
      checksum[1] = (byte)(checksum[1]^data[i + 1]); 
      checksum[2] = (byte)(checksum[2]^data[i + 2]); 
      checksum[3] = (byte)(checksum[3]^data[i + 3]); 
     } 

     int check = 0; 
     for (int i = 0; i <= 3; i++) 
     { 
      int r = (Convert.ToInt32(checksum[i])); 

      int c = (-(r + (1))) & (0xff); 

      c <<= (24 - (i * 8)); 

      check = (check | c); 
     } 

     return check.ToString("X"); 

回答

5

倍數,因爲你用你的i+3循環內,你的數組大小必須總是被4整除您應該將data陣列擴展到滿足進入循環前的要求:

byte[] data = Encoding.ASCII.GetBytes(cmd); 
if (data.Length % 4 != 0) 
{ 
    var data2 = new byte[(data.Length/4 + 1) * 4]; 
    Array.Copy(data, data2, data.Length); 
    data = data2; 
} 
+0

通過擴展數據數組會影響原始字符串? –

+0

不,它不會。源字符串和字節數組不綁定在一起。 – MarcinJuraszek

+0

非常感謝你的幫助:) –

相關問題