繁体   English   中英

C# 中的自定义字符串占位符

[英]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 003F 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM