Преобразование шестнадцатеричного в строковое значение для извлечения значений между STX и ETX путем исключения пробела - PullRequest
0 голосов
/ 30 августа 2018

У меня есть следующий шестнадцатеричный байтовый массив:

Byte[] Bytes = { 0x02, 0x31, 0x20, 0x20, 0x20, 0x20, 0x32, 
                 0x36, 0x38, 0x30, 0x34, 0x03, 0x0D };

И я преобразовал его в строку, используя BitConverter:

String value = BitConverter.ToString(Bytes);

На данный момент value выглядит следующим образом:

"02-31-20-20-20-20-32-36-38-30-34-03-0D"

Теперь мне нужно удалить значения с 02 до последнего 20 и с 03 до 0D. Другими словами, мне нужно извлечь 32-36-38-30-34, исключив все остальное.

Ключевым моментом является то, что 0x02 в шестнадцатеричном формате представляет «Начало текста», 0x20 представляет пробел, а 0x03 представляет «Конец текста». Поэтому мне нужно исключить все значения от «начала текста» до последнего пробела и от «конца текста», чтобы получить значения между ними.

1 Ответ

0 голосов
/ 30 августа 2018

Вот метод, который принимает строку, разбивает ее на строку перевода строки ("0A"), чтобы получить строки данных, затем берет каждую строку и добавляет все после первого пробела ("20") до конец строки ("03") и возвращает список этих строк:

public static List<string> GetData(string allData)
{
    var newLine = "0A";
    var space = "20-";
    var endText = "-03";

    var data = new List<string>();
    if (string.IsNullOrWhiteSpace(allData)) return data;

    var lines = allData.Split(new[] { newLine }, StringSplitOptions.RemoveEmptyEntries);

    foreach (var line in lines)
    {
        var lastSpace = line.LastIndexOf(space);
        if (lastSpace == -1) continue;

        var endOfText = line.IndexOf(endText, lastSpace);
        if (endOfText == -1) continue;

        var start = lastSpace + space.Length;
        var length = endOfText - start;

        data.Add(line.Substring(start, length).Trim('-'));
    }

    return data;
}

Здесь он используется с использованием ваших данных примера из вопроса и комментария. Обратите внимание, что это предполагает, что строка была преобразована уже с использованием BitConverter:

static void Main()
{
    var questionSample = "02-31-20-20-20-20-32-36-38-30-34-03-0D";

    var commentSample = "02-31-20-20-20-20-32-38-39-37-31-03-0D-0A-02-31-20-20-20-" +
                        "20-32-38-39-35-30-03-0D-0A-02-31-20-20-20-20-32-39-30-" +
                        "30-30-03-0D-0A-02-31-20-20-20-20-32-38-38-38-34-03-0D-0A";

    Console.WriteLine(GetData(questionSample).FirstOrDefault());

    Console.WriteLine(new string('-', Console.WindowWidth - 1));

    foreach (var dataLine in GetData(commentSample))
    {
        Console.WriteLine(dataLine);
    }

    GetKeyFromUser("\nPress any key to exit...");
}

Выход

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...