c# - 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 C0 00 00 4E 41 4D 45”我想引入这个数据字符串“00 01 02 [0.5] [1.5] [ NAME]" 然后解析器应该知道在遇到方括号时转换为浮点数或字符串。
我在另一个项目中使用了一个函数,该函数将字符串中的“//”替换为特定数据,但我需要对其进行调整,并且也不确定这是否是正确的方法:
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 编码以及一个简单的单字节的简单案例,但是您需要更改为您需要的任何编码。
推荐阅读
- flutter - 如何从外部关闭 Flutter 对话框
- python - 如何获取文件字段 url 表单 django?
- audio - 使用 FFMPEG 进行快速 WAV 音频解码:加速 avformat_open_input / avformat_find_stream_info
- netsuite - 从 Eclipse 中连接到 NetSuite Sandbox 时出错
- hasura - 如何为所有表应用权限?
- windows - DebugView 不捕获 KdPrint 输出
- python - 为什么过滤器在 views.py 中不起作用?
- javascript - 对象比较复杂性 Javascript
- linux - “bash: unset: `/home/USERNAME/anaconda3/envs/ENVIRONMENT': not a valid identifier” 调用 conda update 或 deactivate
- php - 访问 https://api.paypal.com/v1/payments/payment/ 时得到 Http 响应码 400