Convert.ToInt32 问题和获取错误索引和长度必须引用字符串中的位置

Problem with Convert.ToInt32 and getting error Index and length must refer to a location within the string

我们想从字符串中获取crc码。 例如:字符串为(ff03c1),crc码为(3d).

下面的代码可以正常工作,直到字符串少于 186 个字符。 示例字符串:

20000F38080000D1080020110800190D0000000000000000000000000000000020000F38080000D1080020110800190D000000000000000000000000000000020000F38080000D1080020110800190D000000000000000000000000000

但是这个字符串不起作用(187 个字符):

20000F38080000D1080020110800190D0000000000000000000000000000000020000F38080000D1080020110800190D000000000000000000000000000000020000F38080000D1080020110800190D000000000000000000000000000**0**

错误: 索引和长度必须引用字符串中的位置。 参数名称:长度

public static string CreateCRCCode(string Value)
{
    return Enumerable.Range(0, Value.Length)
                     .Where(x => x % 2 == 0)
                     .Select(x => Convert.ToInt32(Value.Substring(x, 2), 16))
                     .Aggregate((i, i1) => i ^ i1)
                     .ToString("X");
}

我们如何使用超过 186 个字符的字符串?

根本原因

真正的问题不在于 186187 字符,问题在于 oddeven,我想说的是,你会输入 200 也会出现相同的错误。原因是,

  • 考虑到 Value = "200" 所以,Value.Length = 3 因此 Enumerable.Range(0, Value.Length) 会给你 0,1,2.
  • 应用 .Where(x => x % 2 == 0) 后,集合变为 0,2

  • 因此,当应用 substring(Value.Substring(x, 2)) 时,它将搜索从索引 2 开始且长度为 2(in第二次迭代)这不是一个有效的索引。这会导致错误。

建议修复

  • 我没有任何理由在给定的代码段中应用 Where(x => x % 2 == 0),如果有必要,请交叉检查条件和场景。
  • 根据集合长度更改 Enumerable.Range,如下所示:

    Enumerable.Range(0, Value.Length % 2 == 0 ? Value.Length : Value.Length-1)