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

本文关键字:字符串 转换 字符 打印 包含不 | 更新日期: 2023-09-27 18:13:28

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

 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}.

请帮帮我。

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

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

public static string ToBase64String(
    byte[] inArray
)

您可以使用FromBase64String

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

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

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

我似乎误解了这个问题。我的答案只有在字节数组是一个编码字符串的情况下才有意义——我没有读到说它是不可打印字符的那一点,等等。尼古拉的答案是最合适的。:)

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

引用MSDN;

在。net框架2.0版本之前,。net框架允许通过忽略第8位进行欺骗。从。net框架开始2.0,非ascii码点在解码过程中回落。

使用不同的编码基数作为ASCII将改变所有不可打印的字符为?63年。

当字符串不必是人类可读的不可转换字符的版本时,将其转换为base64 (UUEncode/XXEncode)确实可以达到目的。