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

C# 转换包含不可打印字符的字符串,c#,encoding,non-printable,C#,Encoding,Non Printable,我想为我的应用程序将包含不可打印字符的字节数组转换为字符串。当我转换回字节数组时,数组的内容应该保持不变,因为我发现ASCII/Unicode/UTF8并不总是给我正确的解决方案 例如 在上面的示例中,我发现字节数组包含 { 63, 35, 44, 18, 63, 104, 63, 72 ,69}. 请帮助我。使用不同的编码基础,因为ASCII会将所有不可打印的字符更改为?63岁。 当字符串不必是人类可读的非可转位字符版本时,将其转换为base64(UUEncode/XXEncode)确实可以

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

例如

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

{ 63, 35, 44, 18, 63, 104, 63, 72 ,69}.
请帮助我。

使用不同的编码基础,因为ASCII会将所有不可打印的字符更改为?63岁。 当字符串不必是人类可读的非可转位字符版本时,将其转换为base64(UUEncode/XXEncode)确实可以做到这一点。

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

public static string ToBase64String(
    byte[] inArray
)
然后,您可以使用
FromBase64String

public static byte[] FromBase64String(
    string s
)
我认为你的问题在于你使用了错误的编码。ASCII定义128个字符(http://en.wikipedia.org/wiki/ASCII)所以永远不会给你128以上的字节

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


我似乎误解了这个问题。我的答案只有在字节数组是编码字符串的情况下才有意义——我没有读到表示它是不可打印字符等的位。Nikola的答案是值得考虑的。:)

如果您使用ASCI编码将字节数组转换为字符串,请记住ASCI是一个7位协议,编码将去除第8位或返回到特定值(文档中似乎不清楚它是哪一位!)

引用MSDN

在.NET Framework 2.0版之前,.NET Framework允许 通过忽略第8位进行欺骗。从.NET框架开始 2.0,非ASCII码点在解码过程中会后退


不这不是编码工作;编码为string=>byte[]=>string;这个问题是byte[]=>string=>byte[]-base-64或十六进制编码是否正确;编码是错误的;这不是编码工作;编码为string=>byte[]=>string;这个问题是byte[]=>string=>byte[]-base-64或十六进制编码是否正确;编码错误。@MarcGravel:是的,我的错。我没有读这个问题。我想他有一个文本字符串作为字节,因为他正在使用编码。直到后来,我才意识到有些字符是非印刷的,然后看到了你的评论,并正确地阅读了问题。那-1会让我记住以后要正确地阅读这个问题另请参见:@DavidNeale它听起来像是一大块字节——与编码无关。
public static byte[] FromBase64String(
    string s
)