2012-09-10 157 views
2

這是我的一段代碼(文件是HttpPostedFileBase型):C# - Encoding.ASCII.GetString()返回「??」爲什麼?而不是實際的字符串?

var imageStream = file.InputStream; 
var header = new Byte[4]; 
imageStream.Read(header, 0, header.Length); 

現在,雖然我的代碼運行,我把一個斷點,並在我的眼前的窗戶,我檢查值:

header 
{byte[4]} 
    [0]: 255 
    [1]: 216 
    [2]: 255 
    [3]: 224 

但是,當我想這個字節數組轉換爲ASCII字符串,我得到這個(按立即窗口獲得的值):

Encoding.ASCII.GetString(header) 
"????" 
Encoding.ASCII.GetString(header, 0, 2) 
"??" 

我在做什麼錯?

+2

ASCII = 7位編碼,因此數字> 127不是ASCII字符集的一部分。 – spender

回答

5

127以上的字符不能被表示爲ASCII(這是一個7位編碼),因此變成了?

你想達到什麼目的?還有很多其他的編碼可能更適合你想要做的 - 或者根本不編碼。理解char是不等於字節是很重要的。

如果頭是一個「固定的」4字節序列,請不要直接使用字符,而要直接使用字節(或者整數表示 - 請參閱BitConverter類將字節數組轉換爲其他內容)。

+0

我希望它成爲一個字符串,所以我可以使用一個.StartsWith()方法。 – ojek

+1

@ojek,如果你想要它是一個字符串,你需要知道單字節(8位)和Unicode字符集(16位)之間的映射是什麼 - 不管怎樣,字符串比較都不起作用。這就是爲什麼你需要選擇合適的編碼,或者避免使用字符串並比較普通字節。 – Lucero

3

ASCII字符代碼的範圍是0到127(含)。您的數據超出該範圍。因此,將數據解釋爲ASCII的嘗試失敗。 ?字符用於指示無法解碼的字符。

前4個字節,以十六進制,是

FF D8 FF E0 

這對一個JPEG file標題。

因此,將這些字節轉換爲字符串並不恰當。

1

這是因爲這些字符不能使用ASCII打印 - 請嘗試使用Encoding.UTF8.GetString(header)代替。

編輯: 作爲利用UTF8盲目似乎不合適,你也許可以嘗試以下方法: - Request.ContentEncoding.GetString(header)應該利用在請求配置的編碼。

+0

是什麼讓你認爲這些字節是用UTF8編碼的? –

+0

一個公平點 - 但誰說他們沒有? ;-) –

+0

嗯,他們不是,是嗎?我對嘗試和錯誤編程特別厭惡。這就是你所倡導的。 –

相關問題