バイナリ(残念ながらテキスト/ JSONではない)Thriftオブジェクトとしてシリアル化されたファイルを処理するように求められましたが、ファイルを作成したプログラムまたはプログラマーにアクセスできないため、ファイルの構造やフィールドの順序がわかりません。 、など。Thriftライブラリを使用してバイナリファイルを開いて分析し、フィールドタイプ、値、ネストなどのリストを取得する方法はありますか?
1 に答える
残念ながら、Thriftのバイナリプロトコルはデータのタグ付けをほとんど行わないようです。デコードするには、.thriftファイルが手元にあると想定しているように見えるので、たとえば、次の4バイトは整数であると想定されており、実際にはfloatの前半ではありません。したがって、基本的には、16進エディタ(または同等のもの)でファイルを確認し、表示されている正確なパターンに基づいてフィールドを推測しようとしているように見えます。
役立つ情報はほとんどありません。
各ファイルは、バージョン、プロトコル識別子文字列、およびシーケンス番号で始まります。マップは、キーと値のタイプ(整数コードとして最初の2バイト)を識別する6バイトと、4バイト整数としての要素数で始まります。タイプコードは標準のようです(Thriftソースでは定義の正規の場所はTProtocol.hのようです。たとえば、ブール値はタイプコード2で指定され、UTF-8文字列はタイプコード16で指定されます)。 。文字列の前には4バイトの整数長フィールドがあり、リストの前にはタイプ(1バイト)と4バイトの長さがあります。すべての整数フィールドはビッグエンディアンで保存され、フローティングポイントはIEEE形式で保存されているようです(少なくとも、doubleを比較的簡単に見つけることができます)。
ThriftのTBinaryProtocol*ファイルには、さらに役立つ詳細がいくつかあります。プラス面としては、さまざまな実装が用意されているため、最も使いやすい言語で実装されたものを読むことができます。
申し訳ありませんが、これはおそらくそれほど役に立たないことはわかっていますが、実際には、これがThriftバイナリ形式が提供するすべての情報であるように見えます。明らかに、バイナリ形式は、正確なプロトコル仕様を常に知っていることを意図して設計されており、目標は、盲目的にデコードするのを簡単にするのではなく、ワイヤスペースを最小限に抑えることでした。