2012-11-06 125 views
3

我將byte array轉換爲string,並且我將此string轉換爲byte array。 這兩個字節數組是不同的。c#編碼中奇怪的東西

如以下:

byte[] tmp = Encoding.ASCII.GetBytes(Encoding.ASCII.GetString(b)); 

假設b是一個字節數組。

B [0] = 3,B [1] = 188,B [2] = 2 //十進制

結果:

TMP [0] = 3 ,tmp [1] = 63,tmp [2] = 2

這就是我的問題,它有什麼問題?

+4

ASCII有7位數據。您正在尋找ANSI或其他編碼。 – leppie

回答

4

ASCII僅爲7位,所以其他人無效。 By default it uses ? to replace any invalid bytes and that's why you get a ?.

對於8位字符集,你應該尋找要麼Extended ASCII(稍後定義的「ISO 8859-1」)或code page 437(這往往是混淆與擴展ASCII,但事實上並非如此)。

您可以使用下面的代碼:

Encoding enc = Encoding.GetEncoding("iso-8859-1"); 
// For CP437, use Encoding.GetEncoding(437) 
byte[] tmp = enc.GetBytes(enc.GetString(b)); 
5

188超出了ASCII的範圍。不在相應字符集中的字符轉置爲'?'通過設計(你願意轉換爲「1/4」嗎?)

1

字符188沒有爲ASCII定義。相反,你得到63,這是一個問號。

1

ASCII字符集的範圍是從1到127.您可以看到188不在此範圍內,並且轉換爲? (= ASC 63)。

1

並非每個字節序列都必然是特定編碼的有效編碼值序列。

因此對任意字節數組b的定義不明確。 (也可以,對於任何其他編碼)。

如果需要採取任意字節數組,並獲得字符序列,你可能想看看進入ConvertToBase64StringFromBase64String。如果這不是你想要做的,也許可以向我們解釋原始的問題

1

188是不是在ASCII(7位)的範圍內,你應該使用Encoding.Default得到ANSI編碼:只有

byte[] b = new byte[3]{ 3, 188, 2 }; 
byte[] tmp = Encoding.Default.GetBytes(Encoding.Default.GetString(b));