2011-01-05 146 views
1

我刚刚试图为我们公司编写一个小型加密DLL(我第一次必须做这样的事情)时遇到了一个问题。.Net编码命名空间的问题?

如果我使用下面的代码从字符串中获取byte [](在我的情况下是英镑符号£),然后使用.Net Framework的相同区域来获取char [] byte []我得到一个问号而不是预期的£!

任何人都可以解释为什么这是?

byte [] asciiBytes = Encoding.ASCII.GetBytes(“£”); Console.WriteLine(Encoding.ASCII.GetChars(asciiBytes).ToString());

+1

GetChars返回char []对不对? char []。ToString()甚至做任何明智的事情吗? 'new string(char [])'看起来更可能,或者GetString ...? – 2011-01-05 17:20:57

+0

关于您的问题标题的注意事项:编码是一个类,而不是一个名称空间。 – 2011-01-05 17:24:29

+0

我曾经有一个史前的英国设计,有一个字符ROM和键盘用£代替$。该公司没有持续足够长的时间来设定任何标准。 – 2011-01-05 18:26:33

回答

3

您正在尝试使用ASCII编码,但井号不是ASCII。编码不能处理字符,所以它使用“?”的编码形式作为某种事情的错误指标。

我建议你改用UTF-8。所有Unicode字符都可以用UTF-8表示,并且对于真正的ASCII字符串(这很常见)非常有效。

有一点需要注意:加密通常适用于任意二进制数据,并且结果是任意的二进制数据。 不要尝试使用类似Encoding.UTF8.GetString(bytes)的方式将加密结果转换回字符串 - 这将导致数据丢失,因为任意二进制数据几乎肯定不会是有效的UTF-8编码字符序列。如果您需要字符串结果,请使用base64编码:Convert.ToBase64String(bytes)