【问题标题】:Conversion of strings containing non printable characters转换包含不可打印字符的字符串
【发布时间】:2011-11-04 12:32:48
【问题描述】:

我想将包含不可打印字符的字节数组转换为我的应用程序的字符串。当我转换回字节数组时,数组的内容应该保持不变,因为我发现 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}.

请帮助我。

【问题讨论】:

标签: c# encoding non-printable


【解决方案1】:

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

public static string ToBase64String(
    byte[] inArray
)

然后您可以使用 FromBase64String 将字符串解码回字节数组

public static byte[] FromBase64String(
    string s
)

【讨论】:

    【解决方案2】:

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

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

    我误读了这个问题。仅当字节数组是编码字符串时,我的答案才有意义-我没有读过说它是不可打印字符等的内容。尼古拉的答案就是要找的答案。 :)

    【讨论】:

    • 没有;这不是编码的工作;编码为 string => byte[] => string;这个问题是 byte[] => string => byte[] - base-64 或 hex-encoding 是正确的;编码错误。
    • @MarcGravell:是的,我的错。我没有阅读问题。我以为他有一个文本字符串作为字节,因为他正在使用编码。直到后来我才意识到有些字符不会打印,然后看到您的评论并正确阅读了问题。 -1 会让我记得将来正确阅读问题。 ;-)
    【解决方案3】:

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

    引用MSDN;

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • 没有;这不是编码的工作;编码为 string => byte[] => string;这个问题是 byte[] => string => byte[] - base-64 或 hex-encoding 是正确的;编码错误。
      猜你喜欢
      • 2019-06-18
      • 2018-10-21
      • 1970-01-01
      • 1970-01-01
      • 2017-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多