2009-10-13 10 views
5

Ich wurde gebeten, einige serialisierte Dateien als Binärdateien (nicht text/JSON leider) Thrift Objekte zu bearbeiten, aber ich habe keinen Zugriff auf das Programm oder den Programmierer, der die Dateien erstellt, also habe ich keine Ahnung von ihrer Struktur, Feldreihenfolge, etc. Gibt es eine Möglichkeit, mit den Thrift-Bibliotheken eine Binärdatei zu öffnen und zu analysieren, eine Liste der Feldtypen, Werte, Verschachtelung usw. zu bekommen?Wie können Sie eine binäre Sparsamkeitsdatei zurückentwickeln?

+0

Ich gehe davon aus, dass du über http://incubator.apache.org/thrift/ sprichst - du könntest die von dir verwendete Sprache posten/taggen. – TrueWill

Antwort

7

Leider scheint das Binary-Protokoll von Thrift überhaupt nicht viel Tagging von Daten zu machen; Zum Dekodieren scheint es anzunehmen, dass Sie die .Thrift-Datei in der Hand haben, also wissen Sie, die nächsten 4 Bytes sollen eine ganze Zahl sein und sind nicht die erste Hälfte eines Floats. Es sieht also so aus, als würden Sie im Grunde die Dateien in einem Hex-Editor (oder ähnlichem) betrachten und versuchen, Felder basierend auf den genauen Mustern, die Sie sehen, abzuleiten.

Es gibt sehr wenige hilfreich Bits:

Jede Datei beginnt mit einer Version, Protokoll Bezeichnerstring und Sequenznummer. Maps beginnen mit 6 Bytes, die die Schlüssel- und Werttypen (die ersten beiden Bytes als Integer-Codes) plus die Anzahl der Elemente als 4-Byte-Integer angeben. Die Typcodes scheinen Standard zu sein (der kanonische Ort ihrer Definitionen scheint in den Thrift-Quellen TProtocol.h zu sein, z. B. wird ein boolescher Wert durch Typcode 2, UTF-8-String nach Typcode 16 und so weiter angegeben) . Den Strings wird ein 4-Byte-Ganzzahllängenfeld vorangestellt, und den Listen wird der Typ (1 Byte) und eine Länge von 4 Byte vorangestellt. Es sieht so aus, als ob alle Integer-Felder im Big-Endian-Format gespeichert sind und Floating-Points im IEEE-Format gespeichert sind (was das Auffinden von Doppelpunkten relativ einfach machen sollte).

Die TBinaryProtocol * -Dateien in Thrift haben ein paar hilfreiche Details; Auf der positiven Seite gibt es eine Reihe von verschiedenen Implementierungen, so dass Sie diejenigen lesen können, die in der Sprache implementiert sind, mit der Sie am meisten vertraut sind.

Sorry, ich weiß, dass dies wahrscheinlich nicht so hilfreich ist, aber es scheint wirklich, dass dies alle Informationen sind, die das Thrift-Binärformat bietet; Offensichtlich wurde das Binärformat mit der Absicht entworfen, dass Sie immer genau die genaue Protokollspezifikation kennen würden und dass das Ziel der Minimierung des Verdrahtungsraums war, anstatt es überhaupt leicht zu machen, blind zu dekodieren.