十六进制到字符串的转换,通过消除SPACE来提取STX和ETX之间的值

时间:2018-08-30 16:54:04

标签: c# regex string hex string-parsing

我有以下十六进制字节数组:

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以及从030D的值。换句话说,我需要通过消除其余部分来提取32-36-38-30-34

关键点在于,十六进制的0x02代表“文本的开始”,0x20代表空格,0x03代表“文本结尾”。因此,我需要消除“文本开头”到最后一个空格以及“文本结尾”中的所有值,以获取它们之间的值。

1 个答案:

答案 0 :(得分:0)

这是一个方法,它接收一个字符串,将其在换行字符串("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