Member 12017921 Ответов: 4

C# у меня есть строка в ascii, и ее нужно преобразовать в шестнадцатеричную


Здравствуйте у меня есть строка в ascii и ее нужно преобразовать в шестнадцатеричную
пример :
Аски :"
<stx><stx>000000000001000<fs>1000<fs><fs>+0<fs>941<fs><fs><fs><fs><fs><fs><fs><fs><fs><fs><fs>00<fs><fs><fs><etx> "

нужно конвертировать в :
шестиугольный :"
02 02 30 30 30 30 30 30 30 30 30 30 30 31 30 30 30 1C 31 30 30 30 1C 1C 2B 30 1C 39 34 31 1C 1C 1C 1C 1C 1C 1C 1C 1C 1C 1C 30 30 1C 1C 1C 03 14
Я не нашел никакого способа, чтобы результат был такой формы "
02 02 30 30 30 30 30 30 30 30 30 30 30 31 30 30 30 1C 31 30 30 30 1C 1C 2B 30 1C 39 34 31 1C 1C 1C 1C 1C 1C 1C 1C 1C 1C 1C 30 30 1C 1C 1C 03 14

спасибо и жду вашего ответа

Что я уже пробовал:

public static string ConvertStringToHex(string asciiString)
        {
            string hex = "";
            foreach (char c in asciiString)
            {
                int tmp = c;
                hex += String.Format("{0:x2}", (uint)System.Convert.ToUInt32(tmp.ToString()));
            }
            return hex;
        }
но в результате получается : >
3c5354583e3c5354583e3030303030303030303030313130303c46533e313233343c46533e3c46533e2b303c46533e3934313c46533e3c46533e3c46533e3c46533e3c46533e3c46533e3c46533e3c46533e3c46533e3c46533e3c46533e30303c46533e3c46533e3c46533e3c4554583e
Мне нужно :
02 02 30 30 30 30 30 30 30 30 30 30 30 31 30 30 30 1C 31 30 30 30 1C 1C 2B 30 1C 39 34 31 1C 1C 1C 1C 1C 1C 1C 1C 1C 1C 1C 30 30 1C 1C 1C 03 14

4 Ответов

Рейтинг:
1

CPallini

Это не работает, потому что исходная строка содержит текстовое представление элемента управления ASCII коды (вместо реальных). Вы должны правильно его разобрать.


Рейтинг:
1

Patrice T

Ваша проблема заключается в том, что ваша строка экранируется, чтобы показать вам непечатаемые символы.
каждый символ со значением ascii от 0 до 31 не подлежит печати и отображается вам как "<??> " внутренний код, сообщающий вам, какой это код.
Для того чтобы напечатать строку в шестнадцатеричном формате, у вас есть в основном 3 варианта:
- работа с не экранированной строкой в первую очередь.
- повторно преобразуйте экранированную строку в ее исходную форму (двоичную), а затем распечатайте
- ручка сбежавших символов на лету во время печати

Чтобы получить нужный формат вывода, вам нужно добавить пробел между каждым шестнадцатеричным кодом:

public static string ConvertStringToHex(string asciiString)
        {
            string hex = "";
            foreach (char c in asciiString)
            {
                int tmp = c;
                // pay attention to the space at the end of format
                hex += String.Format("{0:x2} ", (uint)System.Convert.ToUInt32(tmp.ToString()));
            }
            return hex;
        }

Единственная проблема-это пробел в конце строки, чтобы решить его, вам нужен цикл for.
public static string ConvertStringToHex(string asciiString)
        {
            int tmp = asciiString[0];
            string hex = String.Format("{0:x2}", tmp);
            for (int scan= 1; scan<asciiString.length; scan++)
            {
                int tmp = asciiString[scan];
                hex += String.Format(" {0:x2}", tmp);
            }
            return hex;
        }


Рейтинг:
0

Eric Lynch

Если вам нужно использовать фактический текст, например "<stx>", В вашей строке для представления управляющего символа, как предлагали другие решения, вам нужно будет написать синтаксический анализатор.

Если вместо этого вы не знакомы с представлением их в строках C#, вы можете использовать следующее:

ConvertStringToHex("\x0002\x0002000000000001000\x001C1000\x001C\x001C+0\x001C941\x001C\x001C\x001C\x001C\x001C\x001C\x001C\x001C\x001C\x001C\x001C00\x001C\x001C\x001C\x0003")
Предполагая, что ваша строка действительно ограничена кодовыми точками от 0 до 255, и вам не нужно разбирать текст типа "<stx>", Следующее сделает то, что вам нужно:
public static string ConvertStringToHex(string asciiString)
{
  var builder = new StringBuilder(asciiString.Length * 3);
  foreach (char c in asciiString)
    if (c < byte.MinValue || c > byte.MaxValue)
      throw new ArgumentException(null, nameof(asciiString));
    else
      builder.AppendFormat("{0:X2} ", (byte)c);
  if (builder.Length > 0)
    builder.Length--;
  return builder.ToString();
}
В этом коде есть несколько вещей, которые следует отметить.

Во-первых, ваш исходный код построил строку путем повторной конкатенации. Это плохая идея. Строковый конструктор гораздо эффективнее для такого рода операций.

Во - вторых, ваш исходный код перепрыгнул через огромное количество обручей, чтобы получить число от персонажа. В этом нет необходимости. Вы можете напрямую разыгрывать char для большинства числовых типов.

Наконец, на всякий случай, если кодовые точки за пределами диапазона 0-255 проскользнут в одну из ваших строк, я добавил чек и выдал исключение, чтобы предупредить потребителя.


Рейтинг:
0

F-ES Sitecore

Вы можете использовать регулярное выражение, чтобы разделить текст на разделы кодов и некодов, а затем проанализировать их соответствующим образом

string ascii = @"<stx><stx>000000000001000<fs>1000<fs><fs>+0<fs>941<fs><fs><fs><fs><fs><fs><fs><fs><fs><fs><fs>00<fs><fs><fs><etx>";

// match any chars in angle brackets, or any groups that are numbers or +
Regex r = new Regex(@"([<]\w+[>]|[\d|+]+)");

MatchCollection mc = r.Matches(ascii);

StringBuilder result = new StringBuilder();

// go through the results
foreach(Match m in mc)
{
    string v = m.Value;

    if (v.StartsWith("<") && v.EndsWith(">"))
    {
        // if it's a code (eg <stx>) use ConvertCodeToHex
        result.Append(ConvertCodeToHex(v));
    }
    else
    {
        // if it's not a code use ConvertStringToHex
        result.Append(ConvertStringToHex(v));
    }
}

string hex = result.ToString();


Теперь вам просто нужно реализовать ConvertCodeToHex (возможно, уже есть функция, которая это делает)

public static string ConvertCodeToHex(string code)
{
    // add the remaining cases
    switch (code.ToLower())
    {
        case "<stx>":
            return "02";
        default:
            return code;
    }
}