我有以下十六进制字节数组:
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
代表“文本的结尾”。因此,我需要消除“文本开始”到最后一个空格的所有值,并从“文本结束”中删除它们之间的值。
这是一个接收字符串的方法,在换行符串("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...");
}
产量