我需要将此字符串strRX="16 255 128"
转换为带有十六进制值strTX="10 FF 80.."
的字符串作为字符串。
在我打印这个之前的某种意义,我要发送的字符串必须改变它的值。
答案 0 :(得分:3)
string strRX="16 255 128";
string strTX = string.Join(" ",strRX.Split().Select(rx => Convert.ToByte(rx).ToString("X")));
答案 1 :(得分:2)
这里要解决两个问题。
首先,我们将字符串拆分为一个字符串数组,每个整数一个。然后我们创建一个存储解析整数的地方,然后我们处理它们中的每一个保留顺序。最后我们构造输出字符串
string strRX = "16 255 128";
string[] ss = strRX.Split(' ');
现在我们必须将每个解析为整数。
int[] ii = new int[ss.Length];
for (int i = 0; i< ss.Length; i++)
{
ii[i] = int.Parse(ss[i]);
}
接下来,我们将每个整数渲染为十六进制字符串。我可以为输出创建新的存储空间,但我只是简单地在输入字符串的顶部写入。示例输出不明确,但古代约定显示十六进制前导零的字节,因此格式说明符为X2。
for (int i = 0; i < ss.Length; i++)
{
ss[i] = ii[i].ToString("X2");
}
显然你可以在同一个循环中做到这一点。
int[] ii = new int[ss.Length];
for (int i = 0; i < ss.Length; i++)
{
ii[i] = int.Parse(ss[i]);
ss[i] = ii[i].ToString("X2");
}
如果你马上完成它们,你就不需要将它们全部保存在阵列中,这样你就可以进一步折叠它。
for (int i = 0; i < ss.Length; i++)
{
ss[i] = int.Parse(ss[i]).ToString("X2");
}
此时你可以将它们重新组合在一起。
string strTX = string.Join(" ", ss);
这就是所有这一切。
string strRX = "16 255 128";
string[] ss = strRX.Split(' ');
for (int i = 0; i < ss.Length; i++)
{
ss[i] = int.Parse(ss[i]).ToString("X2");
}
string strTX = string.Join(" ", ss);
但那很笨重。作为一个集合操作,你可以更加优雅地表达整个事物。
string strRX = "16 255 128";
string strTX = string.Join(" ", strRX.Split().Select(rx => int.Parse(rx).ToString("X2")));
这是如何工作的?
strRX.Split()
获取一个分隔符数组并返回一个字符串数组。从Cetin我们了解到,当分隔符数组为空时,字符串将在空格上分割。 rx => int.Parse(rx).ToString("X2"))
定义了一个lambda表达式,它是一种内联匿名函数,在这种情况下,函数接受参数rx
并返回int.Parse(rx).ToString("X2")
的值。
Select
方法返回生成的数组,在字符串数组的每个元素上调用此函数,并将返回的值组合到另一个数组中。 string.Join(" ", X)
汇集由空格分隔的X元素组成的字符串。现在,来自赞助商的一句话......(只是开玩笑)。
Cetin在评论中建议我应该提到Linqpad是如何方便地进行交互式测试和改进这种表达方式的。
碰巧我也是一个Linqpad粉丝。