[英]Custom string placeholders in C#
现在,我正在处理一个接收一系列字节并通过串行发送它们的应用程序,但这有点麻烦,因为例如我有这种情况:我想通过串行发送两个具有特殊含义的字节,然后两个浮点数,然后是一个字符串:
00 01 02 3F 00 00 00 3F C0 00 00 4E 41 4D 45
其中: 00 01 02
有特殊含义,那么3F 00 00 00
是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 C0 00 00 4E 41 4D 45”我想引入这个数据字符串“00 01 02 [0.5] [1.5] [ NAME]" 然后解析器应该知道在遇到方括号时转换为浮点数或字符串。
我在另一个项目中使用了 function ,它将字符串中的“//”替换为特定数据,但我需要对其进行调整,也不确定这是否是正确的方法:
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 编码以及一个简单的单字节的简单案例,但是您需要更改为您需要的任何编码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.