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 个字符的字符串?
根本原因
真正的问题不在于 186
或 187
字符,问题在于 odd
和 even
,我想说的是,你会输入 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)
我们想从字符串中获取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 个字符的字符串?
根本原因
真正的问题不在于 186
或 187
字符,问题在于 odd
和 even
,我想说的是,你会输入 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)