Проблема с Convert.ToInt32 и получением ошибки. Индекс и длина должны указывать на местоположение в строке - PullRequest
1 голос
/ 24 апреля 2019

Мы хотим получить код 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 символов?

1 Ответ

3 голосов
/ 24 апреля 2019

Основная причина

Реальная проблема не в символах 186 или 187, а в проблемах odd и even. Я пытался сказать, что вы получите ту же ошибку для ввода 200 также. Причина в том, что

  • Учтите, что Значение = "200", поэтому Value.Length = 3 и, следовательно, Enumerable.Range(0, Value.Length) даст вам 0,1,2.
  • После применения .Where(x => x % 2 == 0) коллекция стала 0,2.

  • Таким образом, при применении подстроки (Value.Substring(x, 2)) она будет искать подстроку, начинающуюся с индекса 2 и с длиной 2 (во второй итерации), которая не является действительный индекс. Это вызывает ошибку.

Предложенное исправление :

  • У меня нет никаких оснований для применения Where(x => x % 2 == 0) в данном фрагменте, если это необходимо, пожалуйста, проверьте условия и сценарии.
  • Измените Enumerable.Range в зависимости от длины коллекции следующим образом:

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