c++ - 二进制反序列化 - 如何找到它是什么类型的序列化?

标签 c++ serialization deserialization

我有一个由程序生成的 .dat 文件。程序所有者并不反对解析和编辑这个文件,但他不会给任何人答案。

该文件主要由以这种方式定义的变量组成:

在大多数情况下:

(4 bytes - length of the var name)(var name)(4 bytes of some internal var type)(4 bytes - possibly are elements count)(X bytes of var value)

很少:

(4 bytes - length of the var name)(var name)(1 zero byte)(4 bytes of some internal var type)

所以,例如:

([4 0 0 0][name])[11 0 0 0][1 0 0 0]([9 0 0 0][Alexander])

([8 0 0 0][names])[6 0 0 0](length [3 0 0 0])([4 0 0 0][John])([4 0 0 0][Anne])([7 0 0 0][SomeGuy])

我试图查看 boost 二进制序列化,但它没有在文件中添加变量名,我认为使用 8 个字节,而不是 4 个字节。

最佳答案

没有通用的方法来确定它是“什么类型的序列化”。该格式的作者做出了设计决定并得出了最终格式。它实际上可以是任何东西。您可以做出有根据的猜测(“逆向工程”),但唯一可以确定的方法是从作者那里获得规范。尽管您声称他不介意人们操纵以这种格式存储的文件,但他拒绝提供上述规范让我怀疑这是否属实,最终意味着您可能不得不继续猜测。

关于c++ - 二进制反序列化 - 如何找到它是什么类型的序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43479666/

相关文章:

c# - 从 ASP.NET Web api 调用后端 .NET dll

c++ - 如何访问另一个文件中的结构数组

c# - 简化 JSON 对象反序列化

c++ - 将原始对象写入/读取到文件

Python - 保存除大属性之外的整个类对象

c# - 当事先不知道派生类型时使用 DataContractSerializer 反序列化派生类型

error-handling - 如何在不使整个反序列化失败的情况下使用 Serde 解析可能无法反序列化的字段?

c++ - 在 C++ 中是否允许从括号值列表中赋值 std::array?

java - MusixMatch API 和 GSON : Using track. snippet.get 而不是 track.lyrics.get

c++ - 在两个 cpp 文件的 header 中共享定义的全局变量