2013-12-10 37 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

非常感谢你的帮助:) –

相关问题