在C#.net中查找字符串的校验和

时间:2013-12-10 16:49:36

标签: c# .net checksum xor

您好我想找到单字符串的校验和。这是校验和的要求。

  1. 以十六进制字符表示的32位/ 8字节校验和。
  2. 它应该是标题+会话+正文+消息的XOR。
  3. 假设标题+ session + body + message =“这是测试字符串”。我想计算这个的校验和。到目前为止,我开发了以下代码。

    如果string length(byte[] data)是4的倍数,则会正确计算校验和。

    如果“数据”不是4的倍数,我会收到

    的异常
      

    “System.IndexOutOfRangeException:索引超出了数组的范围”。

    我将从用户那里获取具有不同字符串长度的不同输入,因此字符串长度将是可变的(意味着一些时间用户可以仅在q和A中输入ABCDE,依此类推。)。如何修复此异常问题并使用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");
    

1 个答案:

答案 0 :(得分: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;
}