5

我被要求处理一些序列化为二进制文件(不幸的是不是文本/JSON)Thrift对象,但我无权访问创建文件的程序或程序员,所以我不知道它们的结构、字段顺序等。有没有办法使用 Thrift 库打开二进制文件并分析它,获取字段类型、值、嵌套等的列表?

4

1 回答 1

8

不幸的是,Thrift 的二进制协议似乎根本没有对数据进行太多标记。解码它似乎假设你手头有 .thrift 文件,所以你知道,比如说,接下来的 4 个字节应该是一个整数,实际上不是浮点数的前半部分。因此,基本上,您似乎被困在十六进制编辑器(或等效)中查看文件并尝试根据您看到的确切模式推断字段。

有一些有用的位:

每个文件都以版本、协议标识符字符串和序列号开头。映射将以 6 个字节开始,标识键和值类型(前两个字节,作为整数代码)加上作为 4 字节整数的元素数量。类型代码似乎是标准的(它们定义的规范位置似乎是 Thrift 源中的 TProtocol.h,例如,布尔值由类型代码 2 指定,UTF-8 字符串由类型代码 16 指定,等等) . 字符串以 4 字节整数长度字段为前缀,列表以类型(1 字节)和 4 字节长度为前缀。看起来所有整数字段都以大端方式保存,浮点数以 IEEE 格式保存(这应该使双精度数相对容易找到,至少)。

Thrift 中的 TBinaryProtocol* 文件有一些更有用的细节;从好的方面来说,有许多不同的实现,因此您可以阅读以您最熟悉的语言实现的那些。

抱歉,我知道这可能没那么有用,但看起来这确实是 Thrift 二进制格式提供的所有信息;显然,二进制格式的设计目的是让您始终知道确切的协议规范,并且目标是最小化线路空间,而不是使其易于盲目解码。

于 2009-10-13T17:46:56.537 回答