c#自定义字符串占位符



现在,我正在研究一个应用程序,它接收一系列字节并通过串行发送它们,但它有点麻烦,因为例如我有这个场景:我想通过串行发送两个具有特殊含义的字节,然后两个浮点数,然后一个字符串:

00 01 02 3F 00 00 00 3F C0 00 00 4E 41 4D 45

式中:00 01 02有特殊含义,3F 00 00 00为0.5,3F C0 00 00为1.5,最后一个4E 41 4D 45为字符串NAME。

正如你所看到的,我需要手动进行转换,然后形成我想要发送的数据,但我想要的是创建某种类型的占位符的字符串格式化器,用于自动转换这个示例的data(作为字符串):"00 01 02 [0.5] [1.5] [NAME]"

所以与其在文本框中引入这些不太好的数据"00 01 02 3F 00 00 00 3F c00 00 00 4E 41 4D 45"我想介绍这串数据"00 01 02 [0.5] [1.5] [NAME]"然后解析器应该知道在满足方括号的情况下转换为float还是string。

在其他项目中,我使用了一个函数来替换"//"从一个具有特定数据的字符串,但我需要适应它,也不确定这是否是正确的方法:

private string dataParser(string input)
{
string s = input;
string[] tokens = s.Split(new[] { "//" }, StringSplitOptions.None);
StringBuilder sb = new StringBuilder();
int counter = 0;
for (int i = 0; i < tokens.Length; i++)
{
sb.Append(tokens[i]);
if (i < tokens.Length - 1)
sb.Append(hexfloatArray[counter++]);
}
return sb.ToString().Replace(" ", "");
}

您可以很容易地使用正则表达式将括号内的标记转换为不同的值。

var value = "00 01 02 [0.5] [1.5] [NAME]";
// Replace something like [x.y] with it's byte string
value = Regex.Replace(value, "\[(\d+\.\d+)]", (m) =>
{
// This is the number from the section
var number = float.Parse(m.Groups[1].Value);
// Encode it as Ff + bytes from number for this example
string ret = "FF";
foreach (var x in BitConverter.GetBytes(number))
{
ret += " " + x.ToString("x2");
}
return ret;
});
// Replace anything else in brackets as if it's a string
value = Regex.Replace(value, "\[(.*?)]", (m) =>
{
// This is the string from the section
var str = m.Groups[1].Value;
// Encode it as FE + UTF8 bytes for this example
string ret = "FE";
foreach (var x in Encoding.UTF8.GetBytes(str))
{
ret += " " + x.ToString("x2");
}
return ret;
});
Console.WriteLine(value);
// Shows: 00 01 02 FF 00 00 00 3f FF 00 00 c0 3f FE 4e 41 4d 45

这里的想法是找到不同的特殊情况,并将它们转换为lambda表达式中字符串中期望的字节。我已经展示了一个使用BitConverter和UTF-8编码以及一个简单的单字节的简单案例,但是您需要更改为您需要的任何编码。

最新更新