【问题标题】:Convert BinarySerialized Byte Array to readable string将 BinarySerialized 字节数组转换为可读字符串
【发布时间】:2018-12-19 15:32:17
【问题描述】:

当您使用 BinaryFormatter 在 .Net 中对对象进行二进制序列化时,您最终会得到一个显然对人类毫无意义的字节数组。

这个字节数组是否对应于人类可读的更有意义的字符串表示?或者您是否需要完全反序列化它以使其更具人类可读性?

我希望二进制格式化程序在发出字节数组之前具有它使用的对象的一些中间字符串表示形式。这将非常适合我的需求...

我尝试对字节数组进行 Base64 编码,但结果是乱码。

编辑:

正如我在回答中所解释的,UTF8 编码是你能得到的最好的。

我想这样做的原因是我可以区分两个 binarySerialization 并且只存储第一个序列化和 diff,并且有兴趣了解序列化是如何工作的,以便找出如何最好地区分字节数组。

【问题讨论】:

  • 使用以下命令将它变成一个字符串:byte[] data = null; string bytes = string.Join(" ",data.Select(x => x.ToString("x2")));
  • @jdweng 恐怕这也会导致胡言乱语......
  • 参见stackoverflow.com/a/30176566/292411 以获取BinaryFormatter 的示例输出。也许对于程序员来说,这不是完整的胡言乱语,但妻子(或丈夫,取决于谁是谁,呃!)甚至不会尝试阅读。
  • 您正在从字节中读取整数。数字是否假设在特定范围内?二进制数据通常是不同大小对象的组合,您必须根据预期大小读取对象。您必须找到二进制数据的规范并根据规范读取。一旦知道结构,就可以读取二进制文件的各个部分。二进制图像通常在开头有一个 ascii 标头,其中给出了文件名、图像类型(如 jpeg)和图像大小。你可以用记事本打开一张图片,看看ascii header。
  • 二进制格式并不意味着被读取,而是被存储/传输/反序列化。在对象和它的二进制序列化形式之间肯定没有任何类似字符串的东西。 Base64 仅用于将字节作为十六进制文本传输 - 如果您知道数据的确切格式,则可以检查某些内容。有时您可以简单地尝试将二进制文件作为文本读取(忽略错误),如果它包含 ASCII 来查看这些内容。你能告诉我们你真正想做什么吗?

标签: c# .net binaryformatter binary-serialization


【解决方案1】:

How to analyse contents of binary serialization stream? 更详细地讨论了二进制序列化的格式,并且还提供了到各种分析器的链接。

没有完全人类可读的中间表示,但使用 Console.WriteLine(System.Text.Encoding.UTF8.GetString(bytes)); 将返回一些可能可行的内容,具体取决于所需的确切目的。

请注意,只有部分字节可以使用 UTF8 进行解码,因为只有部分字节数组是 UTF8 编码的。结果字符串中会有很多未找到的符号。

以序列化以下内容并将结果转换为 UTF8 字符串为例:

namespace MyNamespace
{
    [Serializable]
    public class Class
    {
        private readonly int _int = 42;

        public string String { get; } = "MyString";
    }
}

结果:

"    ????          ConsoleApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null   MyNamespace.Class   _int<String>k__BackingField   *    MyString"

这不是完全没用...

【讨论】:

    猜你喜欢
    • 2021-11-11
    • 1970-01-01
    • 1970-01-01
    • 2018-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多