繁体   English   中英

将ASCII字符串转换为十六进制字符串

[英]Convert a ASCII string to Hex string

我需要将此字符串strRX="16 255 128"转换为十六进制值strTX="10 FF 80.."的字符串。 这意味着在我打印此文件之前,要发送的字符串必须更改其值。

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")));

这是如何运作的?

  1. strRX.Split()接受一个分隔符数组并返回一个字符串数组。 从Cetin中我们了解到,当分隔符数组为空时,字符串将在空白处拆分。
  2. LINQ Select方法可以应用于任何包含数组的IEnumerable。
  3. rx => int.Parse(rx).ToString("X2"))定义一个lambda表达式,它是一种内联匿名函数,在这种情况下,该函数接受参数rx并返回int.Parse(rx).ToString("X2") Select方法返回生成的数组,方法是在字符串数组的每个元素上调用此函数并将返回的值组合到另一个数组中。
  4. string.Join(" ", X)从X元素中用空格分隔组成一个字符串。

现在,我们赞助商的一句话……(只是在开玩笑)。

塞廷在评论中建议我要提到Linqpad在交互式测试和改进这种表达方式方面有多方便。

碰巧的是,我也有点像Linqpad粉丝。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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