EDIT
Как указывает @Lasse, Substring
принимает начальный индекс и длину , но похоже, что вы пытаетесь передать ему начальный индекс и стоп-индекс , поскольку вы передаете i + 2
на каждый звонок.Это означает, что первая итерация создаст двухсимвольную подстроку, вторая будет трехсимвольной подстрокой и так далее.Просто передайте ему 2
:
String hs = hexString.Substring(i, 2);
Это должно исправить реальную проблему.
Хотя это ничего не нарушает, вы должны знать, что вы делаете не преобразование в ASCII.ASCII - это конкретная кодировка символов, а Convert.ToChar
преобразует число в соответствующий ему Unicode (в частности, UTF-16).Пока ваши значения находятся в диапазоне от 0
до 127
(00
до 7F
в шестнадцатеричном формате), все в порядке для всех практических целей, поскольку форматы Unicode совместно используют символы со стандартным набором символов ASCII.Однако, если ваши персонажи используют одно из расширений в ASCII (например, Latin-1, которое обычно используется в Windows), тогда эти символы будут не совпадать.
Если ваши данныев формате ASCII, и вам нужно поддерживать значения больше 127, вы можете преобразовать свою шестнадцатеричную строку в byte[]
, а затем передать ее в класс ASCIIEncoding
для анализа этих данных в формате ASCII:
byte[] data = new byte[hexString.Length / 2];
for(int i = 0; i < hexString.Length - 1; i += 2)
{
data[i / 2] = byte.Parse(hexString.Substring(i, 2));
}
string output = System.Text.Encoding.ASCII.GetString(data);