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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了十六进制到字符串转换,通过消除SPACE在STX和ETX之间提取值相关的知识,希望对你有一定的参考价值。

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

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代表“文本的结尾”。因此,我需要消除“文本开始”到最后一个空格的所有值,并从“文本结束”中删除它们之间的值。

答案

这是一个接收字符串的方法,在换行符串("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("
Press any key to exit...");
}

产量

enter image description here

以上是关于十六进制到字符串转换,通过消除SPACE在STX和ETX之间提取值的主要内容,如果未能解决你的问题,请参考以下文章

Base64原理和转换会变大33%左右的原因

ASCII与HEX对照转换表

ASCII值对照表

ascii码对照表

C将浮点数转换为int

Java/Android 字符串到颜色的转换