【问题标题】:find checksum of a string in C# .net在 C# .net 中查找字符串的校验和
【发布时间】:2013-12-10 16:49:35
【问题描述】:

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

  1. 32 位/8 字节校验和以十六进制字符表示。
  2. 应该是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");

【问题讨论】:

    标签: c# .net checksum xor


    【解决方案1】:

    因为您在循环中使用 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;
    }
    

    【讨论】:

    • 通过扩展数据数组会影响原始字符串吗?
    • 不,不会。源string 和字节数组没有绑定在一起。
    猜你喜欢
    • 1970-01-01
    • 2011-11-05
    • 2012-04-07
    • 1970-01-01
    • 1970-01-01
    • 2016-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多