2010-07-30 94 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()); 
    } 
} 
相關問題