Wie kann man feststellen, ob eine Zeichenkette komprimiert wurde?

7

Wie kann ich feststellen, ob ein String mit gzcompress komprimiert wurde (abgesehen vom Vergleich) Größe der Zeichenfolge vor / nach dem Aufruf gzuncompress , oder wäre das der richtige Weg zu tun es)?

    
Max 11.06.2012, 07:08
quelle

2 Antworten

8

Eine Zeichenfolge und eine komprimierte Zeichenfolge sind beide einfach Sequenzen von Bytes. Sie können eine Bytefolge nicht wirklich von einer anderen Bytefolge unterscheiden. Sie sollten wissen, ob ein Byteblock ein komprimiertes Format darstellt oder nicht von den zugehörigen Metadaten.

Wenn Sie programmgesteuert erraten müssen, haben Sie mehrere Möglichkeiten, die Sie ausprobieren können:

  • Versuchen Sie, die Zeichenfolge zu dekomprimieren und festzustellen, ob die Operation zum Dekomprimieren erfolgreich ist. Wenn dies fehlschlägt, stellen die Bytes wahrscheinlich keine komprimierte Zeichenfolge dar.
  • Versuchen Sie, vor " 0x20 " nach offensichtlichen "seltsamen" Bytes zu suchen. Diese Bytes werden normalerweise nicht in normalem Text verwendet. Es gibt jedoch keine wirkliche Garantie dafür, dass sie in einer komprimierten Zeichenfolge auftreten.
  • Verwenden Sie mb_check_encoding , um zu ermitteln, ob eine Zeichenfolge in der Codierung gültig ist, in der Sie vermuten, dass sie darin enthalten ist. Ist dies nicht der Fall, Es ist wahrscheinlich komprimiert (oder Sie haben auf die falsche Codierung überprüft). Mit der Einschränkung, dass praktisch jede Byte-Sequenz in praktisch jeder Einzelbyte-Kodierung gültig ist, funktioniert dies nur für Multi-Byte-Kodierungen.
deceze 11.06.2012, 07:16
quelle
15

PRE:
Ich schätze, wenn Sie eine Anfrage senden, können Sie sofort in $http_response_header schauen, um zu sehen, ob eines der Elemente im Array ist eine Variation von Content-Encoding: gzip . Aber das ist LAME!
es gibt eine weitaus bessere Methode.


Hier ist WIE MAN ...

Überprüfen Sie, ob es GZIP ist. Wie ein BOSS!

  

nach GZIP RFC :

Die Kopfzeile des gzip-Inhalts sieht wie folgt aus

%Vor%

Der ID1 und ID2 identifizieren den Inhalt als GZIP . Und CM gibt an, dass die ZLIB_ENCODING (die Komprimierungsmethode) ZLIB_ENCODING_DEFLATE ist - was normalerweise von GZIP mit allen Webservern verwendet wird.

oh! und sie haben feste Werte:

  • Der Wert von ID1 ist "\x1f"
  • Der Wert von ID2 ist "\x8b"
  • Der Wert von CM ist "\x08" (oder nur 8 ...)

fast da:

$is_gzip = 0 === mb_strpos($mystery_string , "\x1f" . "\x8b" . "\x08");

Arbeitsbeispiel

%Vor%

Was sehen wir hier, das ist erwähnenswert?

  • Beginnen Sie mit der Initialisierung der PHP-Engine, um UTF-8 zu verwenden (da wir nicht wirklich wissen, ob der Webserver einen GZIP-Inhalt zurückgibt.
  • )
  • Wenn der Header Accept-Encoding: gzip angegeben wird, teilt er dem Web-Server mit, dass einen GZIP-Inhalt ausgeben darf.
  • Ermitteln des GZIP-Inhalts (Sie sollten die Multi-Byte-Funktionen mit ASCII-Codierung verwenden).
  • Schließlich wird die einfache Ausgabe zurückgegeben, die mit den ZLIB -Methoden einfach ist.
user257319 25.03.2015 23:59
quelle

Tags und Links