/ / Behält zlibs "uncompress" die ursprüngliche Endianz der Daten bei, oder führt sie eine Endian-Konvertierung durch? - zlib, endianness, dekomprimiere

Behält zlibs "uncompress" die ursprüngliche Endianz der Daten bei, oder führt sie eine Endian-Konvertierung durch? - zlib, endianness, dekomprimiere

Ich arbeite mit Legacy-C ++ - Code, auf den zugegriffen wirdZwei-Byte-Integer-Daten, die in einer SQLite-Datenbank komprimiert wurden. Der Code verwendet zlibs Dekomprimierungsfunktion, um die Daten zu extrahieren, die auf meiner Little-Endian-Maschine als Little-Endian-Werte ausgegeben werden.

Um die Möglichkeit zu berücksichtigen, dass dieser Code möglicherweiseauf Big-Endian-Maschinen portiert werden, muss ich wissen, ob die Daten immer in Little-Endian-Reihenfolge dekomprimiert werden, oder ob (stattdessen) zlib die Konvertierung irgendwie ausführt.

Dies ist der einzige zutreffende Hinweis, den ich für (aus zlibs FAQ auf ihrer Site) finden konnte:

  1. Wird zlib an einer Big-Endian- oder Little-Endian-Architektur arbeiten, und kann ich komprimierte Daten zwischen ihnen austauschen? Ja und ja.

Beantwortet meine Frage nicht wirklich ... Ich bin bereit, die Endian-Konvertierung bei Bedarf zu handhaben. Ist es sicher anzunehmen, dass die ursprüngliche Endlichkeit der Eingabedaten das ist, was Sie zurückbekommen, unabhängig von der Plattform, auf der Sie uncompress ausführen? (Ich habe keinen Zugriff auf eine große Endian-Maschine, auf der ich das selbst testen kann).

Antworten:

2 für die Antwort № 1

zlib komprimiert und dekomprimiert einen Stream vonBytes verlustfrei. Also was auch immer Endianess einging ist genau das, was herauskommt. Dies ist völlig unabhängig von der Endgültigkeit der Kompressions- und Dekompressionsmaschinen.

Der FAQ-Eintrag bezieht sich auf die Tatsache, dass der Code so geschrieben wurde, dass er für die Endgültigkeit der Architektur, in die der Code kompiliert und auf der er ausgeführt wird, unempfindlich ist.


1 für die Antwort № 2

RFC1950 legt ausdrücklich fest, wie zlib "s besitzen Meta-Daten Multi-Byte-Werte werden gespeichert:

Innerhalb eines Computers kann eine Nummer mehrere belegenBytes. Alle Multibyte-Nummern in dem hier beschriebenen Format werden zuerst mit dem MOST-signifikanten Byte (an der unteren Speicheradresse) gespeichert. Zum Beispiel wird die Dezimalzahl 520 wie folgt gespeichert:

         0     1
+--------+--------+
|00000010|00001000|
+--------+--------+
^        ^
|        |
|        + less significant byte = 8
+ more significant byte = 2 x 256

So Operationen in Bezug auf Multi-Byte-Werte für intern Verwendung von zlib Muss berücksichtigen Sie Endianness (was FAQ # 26 beantwortet hat).

Die komprimierten Daten selbst bleiben unverändert, da zlib mit einer Granularität von Bytes und nicht mit größeren Einheiten komprimiert und dekomprimiert wird.