2010-07-30 101 views
2

我有一个设备发送表示其设置的字符串数据,但数据在字符串中以Unicode(?)表示形式编码。例如,设备发送表示字符串“System”的字符串“00530079007300740065006D”。 C#中是否有函数将把设备发送的字符串数据转换为实际的字符串?如果没有,有人可以告诉我如何最好地执行此转换?C# - 将字符串数据转换为实际字符串表示形式

+0

有可能是一个内置的功能,但不知道编码“系统”的手段,该字符串其很难给你一个明确的解决方案。 – Jamiec 2010-07-30 14:48:51

+0

回答上面我自己的意见。它绝对是十六进制。 – Jamiec 2010-07-30 15:06:41

回答

0

是的,.NET有一种内置的方法可以将给定的编码类型转换为另一种类型,比如UTF8-> ASCII或其他类型。您需要的命名空间是System.Text.Encoding

1

这是不是一个内置功能,但它只有一行代码:

string input = "00530079007300740065006D"; 

String output = new String(Enumerable.Range(0, input.Length/4) 
    .Select(idx => (char)int.Parse(input.Substring(idx * 4,4), 
      NumberStyles.HexNumber)).ToArray()); 

这里的一个又一个,这也许是多了几分高尚在没有做哈克炭/ int cast:

string out2 = 
    Encoding.BigEndianUnicode.GetString(Enumerable.Range(0, input.Length/2) 
    .Select(idx => byte.Parse(input.Substring(idx * 2, 2), 
      NumberStyles.HexNumber)).ToArray()); 
+0

我在想它看起来像十六进制,但你的解决方案抛出一个OverflowException解析到Int32。 – Jamiec 2010-07-30 15:03:15

+0

我的解决方案已经在我发布之前在Linqpad上运行 - 不知道翻译中发生了什么...... – 2010-07-30 15:07:24

+2

你的子串应该是'input.Substring(idx * 4,4)',当然吗?否则,它会在您的开始索引后得到字符串的其余部分。你只需要每个int 4字符 – Jamiec 2010-07-30 15:10:57

1

完全跳上@威尔迪恩的解决方案在这里(所以不要标记为答案)。

如果你使用了威尔的解决方案很多,我建议它包装成一个字符串扩展:

public static class StringExtensions 
{ 
    public static string HexToString(this string input) 
    { 
     return new String(Enumerable.Range(0, input.Length/4) 
           .Select(idx => (char) int.Parse(input.Substring(idx*4,4), 
                   NumberStyles.HexNumber)).ToArray()); 
    } 
} 
相关问题