Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#.net中查找字符串的校验和_C#_.net_Checksum_Xor - Fatal编程技术网

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

在C#.net中查找字符串的校验和,c#,.net,checksum,xor,C#,.net,Checksum,Xor,嗨,我想找到单个字符串的校验和。以下是校验和的要求 以十六进制字符表示的32位/8字节校验和 它应该是头+会话+正文+消息的异或 假设header+session+body+message=“这是测试字符串”。我想计算这个的校验和。到目前为止,我已经开发了以下代码 如果字符串长度(字节[]数据)是4的倍数,则正确计算校验和 如果“数据”不是4的倍数,我将收到异常作为 “System.IndexOutOfRangeException:索引超出了数组的边界” 我将从用户那里获得不同的输入,具有不同的

嗨,我想找到单个字符串的校验和。以下是校验和的要求

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

    如果
    字符串长度(字节[]数据)
    是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");
    
    公共字符串findchecksum(字符串用户输入)
    尝试
    {
    ascienceoding enc=新的ascienceoding();
    字节[]数据=Encoding.ASCII.GetBytes(用户输入);
    字节[]校验和=新字节[4];
    
    对于(int i=16;i由于在循环中使用
    i+3
    ,因此数组大小必须始终可被4整除。在进入循环之前,应扩展
    数据
    数组以满足该要求:

    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;
    }
    

    扩展数据数组会影响原始字符串吗?不会。源
    字符串
    和字节数组不会绑定在一起。