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

时间:2016-04-04 23:17:07

标签: c#

我需要将此字符串strRX="16 255 128"转换为带有十六进制值strTX="10 FF 80.."的字符串作为字符串。 在我打印这个之前的某种意义,我要发送的字符串必须改变它的值。

2 个答案:

答案 0 :(得分:3)

string strRX="16 255 128";
string strTX = string.Join(" ",strRX.Split().Select(rx => Convert.ToByte(rx).ToString("X")));

答案 1 :(得分:2)

这里要解决两个问题。

  1. 将以十进制格式呈现的以空格分隔的整数字符串解析为整数数组。
  2. 将整数数组渲染为以十六进制格式呈现的以空格分隔的整数字符串。
  3. 首先,我们将字符串拆分为一个字符串数组,每个整数一个。然后我们创建一个存储解析整数的地方,然后我们处理它们中的每一个保留顺序。最后我们构造输出字符串

    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元素组成的字符串。
    5. 现在,来自赞助商的一句话......(只是开玩笑)。

      Cetin在评论中建议我应该提到Linqpad是如何方便地进行交互式测试和改进这种表达方式的。

      碰巧我也是一个Linqpad粉丝。