Как разделить длинный текст на байты c # - PullRequest
0 голосов
/ 07 января 2019

Я уже новичок в кодировании, но моя проблема в том, как разделить код likt этого «7900BD7400BD7500BD76A5FF» на этот «79 00 BD 74 00 BD 75 00 BD 76 A5 FF». Моей главной проблемой было преобразование hex в ascii, но любое решение, которое я получил, конвертировало только «короткое» выражение. Может быть, кто-нибудь может дать мне несколько советов? Я буду очень благодарен

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Более общее решение проблемы:

static String SeparateBy(
    this string str, 
    string separator, 
    int groupLength)
{
    var buffer = new StringBuilder();

    for (var i = 0; i < str.Length; i++)
    {
        if (i % groupLength == 0)
        {
            buffer.Append(separator);
        }

        buffer.Append(str[i]);
    }

    return buffer.ToString();
}

И вы бы назвали это как: "7900BD7400BD7500BD76A5FF".SeparateBy(" ", 2)

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

0 голосов
/ 07 января 2019

Поскольку вы, кажется, не обладаете большими знаниями в обработке строк, я приведу пример, который не требует, чтобы вы выучили слишком много вещей одновременно:

string input = "7900BD7400BD7500BD76A5FF";
string output = string.Empty;
for(int i=0; i<input.Length; i+=2) // Go in steps of 2
{
    output += input[i];    // The first of 2 characters
    output += input[i+1];  // The second of 2 characters
    output += ' ';         // The space
}
Console.WriteLine(output);

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

Этот подход не очень эффективен для длинных строк (если у вас длинный текст, узнайте о StringBuilder ).


Если вы следовали этому совету для создания шестнадцатеричных данных , то, конечно, гораздо проще вставить пробел сразу:

public static string ByteArrayToString(byte[] ba)
{
  StringBuilder hex = new StringBuilder(ba.Length * 2);
  foreach (byte b in ba)
    hex.AppendFormat("{0:X2} ", b);             // <-- I inserted a space in the format string
  return hex.ToString();
}
...