C # hex в ascii - PullRequest
       28

C # hex в ascii

17 голосов
/ 10 апреля 2011

Я пытаюсь преобразовать строку гекса в ASCII, используя это:

public void ConvertHex(String hexString)
{
    StringBuilder sb = new StringBuilder();

    for (int i = 0; i < hexString.Length; i += 2)
    {
        String hs = hexString.Substring(i, i + 2);
        System.Convert.ToChar(System.Convert.ToUInt32(hexString.Substring(0, 2), 16)).ToString();
    }
    String ascii = sb.ToString();
    MessageBox.Show(ascii);
}

, но я получаю исключение out или bounds, я уверен, что это явная ошибка, но другой код у меня естьпопробовал тоже не работает.Что я делаю не так?

Ответы [ 4 ]

24 голосов
/ 29 августа 2014

Этот код преобразует шестнадцатеричную строку в ASCII, вы можете скопировать ее, вставить в класс и использовать без экземпляра

public static string ConvertHex(String hexString)
{
    try
    {
        string ascii = string.Empty;

        for (int i = 0; i < hexString.Length; i += 2)
        {
            String hs = string.Empty;

            hs   = hexString.Substring(i,2);
            uint decval =   System.Convert.ToUInt32(hs, 16);
            char character = System.Convert.ToChar(decval);
            ascii += character;

        }

        return ascii;
    }
    catch (Exception ex) { Console.WriteLine(ex.Message); }

    return string.Empty;
}
19 голосов
/ 10 апреля 2011

Здесь четыре три проблемы:

  1. Поскольку вы увеличиваете i на 2 на каждой итерации, вам нужно завершить на hexString.Length - 1. Это на самом деле не имеет значения;увеличение на два после последней итерации приведет к тому, что счетчик превысит проверенную длину, независимо от того.
  2. Вы берете неправильное количество символов из hexString.
  3. hs никогда не используется.
  4. Вы ничего не добавляете к sb.

Попробуйте это:

for (int i = 0; i < hexString.Length; i += 2)
{
    string hs = hexString.Substring(i, 2);
    sb.Append(Convert.ToChar(Convert.ToUInt32(hs, 16)));
}

Обратите внимание, что нет необходимости квалифицировать типы по их пространству имен, System (при условии, что вы указали на него в верхней части файла с помощью оператора using).

2 голосов
/ 10 апреля 2011
String hs = hexString.Substring(i, i + 2);
System.Convert.ToChar(System.Convert.ToUInt32(hexString.Substring(0, 2), 16)).ToString();

Вы замечаете, что никогда не используете hs ??

И что вы конвертируете первые 2 символа снова и снова?

1 голос
/ 10 апреля 2011

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

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