2012-09-10 159 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

嗯,他们不是,是吗?我对尝试和错误编程特别厌恶。这就是你所倡导的。 –

相关问题