Проблемы с преобразованием hex в ascii в C # - PullRequest
1 голос
/ 11 апреля 2011

Возникли проблемы с кодом ниже, я получаю эту ошибку ...

значение было слишком большим или маленьким для символа ... в строке

sb.Append (Convert.ToChar (Convert.ToUInt32 (hs, 16)));

        for (int i = 0; i < hexString.Length - 1; i += 2)
        {
            String hs = hexString.Substring(i, i + 2);

            sb.Append(Convert.ToChar(Convert.ToUInt32(hs, 16)));

        }

Любой совет, новый для C #?

спасибо:)

Ответы [ 3 ]

0 голосов
/ 11 апреля 2011

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);
0 голосов
/ 11 апреля 2011
string assumedASCII = string.Format(@"\x{0:x4}", (int)hexString);
0 голосов
/ 11 апреля 2011

Похоже, ваша шестнадцатеричная подстрока при преобразовании в бит 16 UInt32 с основанием 16 (шестнадцатеричное) слишком велика (выходит за пределы) набора символов, который вы используете.

Проверьте ваше преобразование в Uint32 и убедитесь, что действительно может быть преобразовано в символ, то есть оно действительно.

...