转换包含不可打印字符的字符串

时间:2011-11-04 12:32:49

标签: c# encoding non-printable

我想将包含不可打印字符的字节数组转换为我的应用程序的字符串。当我转换回字节数组时,数组的内容应该保持相同,我发现ASCII / Unicode / UTF8并不总能给我正确的解决方案吗?

E.g

 byte[] bytearray ={ 147, 35, 44, 18, 255, 104, 206, 72 ,69};

 string str = System.Text.Encoding.ASCII.GetString(bytearray);

 bytearray = System.Text.Encoding.ASCII.GetBytes(str);

在上面的例子中,我发现字节数组包含

{ 63, 35, 44, 18, 63, 104, 63, 72 ,69}.

请帮帮我。

4 个答案:

答案 0 :(得分:8)

看看Convert.ToBase64String方法。它会将字节数组转换为字符串。请记住,编码为字符串,数据将占用比原始字节数组更多的空间。

public static string ToBase64String(
    byte[] inArray
)

然后,您可以使用FromBase64String

将字符串解码回字节数组
public static byte[] FromBase64String(
    string s
)

答案 1 :(得分:1)

我认为你的问题是你使用了错误的编码。 ASCII定义了128个字符(http://en.wikipedia.org/wiki/ASCII),所以永远不会给你128以上的字节。

如果您希望回程成功,您需要找到正确的编码并使用它。

我误解了这个问题。我的答案只有在字节数组是一个编码的字符串时才有意义 - 我没有读过那些说它是不可打印的字符的位等等.Nikola的答案就是那个。 :)

答案 2 :(得分:0)

使用不同的编码基础,因为ASCII会将所有不可打印的字符更改为? 63岁。

当字符串不必是人类可读的非可释放字符版本时,确实将其转换为base64(UUEncode / XXEncode)确实可以解决问题。

答案 3 :(得分:0)

您使用ASCI编码将字节数组转换为字符串,请记住ASCI是一个7位协议,编码将剥离第8位或回退到特定值(文档似乎不清楚它是做什么的!)

引用MSDN;

  

在.NET Framework 2.0版之前,.NET Framework允许   忽略第8位欺骗。从.NET Framework开始   2.0,非ASCII码点在解码过程中回落。