2012-12-03 7 views
0

J'essaie d'apprendre l'algorithme Inflate en l'implémentant en Java pour pouvoir ensuite l'implémenter en assembly pour un CPU avec un jeu d'instructions très restreint.gzip: Interprétation des bits pour la décompression

J'ai des difficultés à lire les longueurs de code correctes du fichier après avoir lu le nombre de codes littéraux, de distance et de longueur. Je suis suite à une implémentation comme décrit here, où ils fournissent un exemple de fichier .gz gunzip.c.gz. Après avoir lu dans les en-têtes de gzip, ce qui suit est les 56 premiers bits du premier (et si je lis correctement, uniquement) bloc de données compressées:

10111101 00011011 11111101 01101111 11011010 11001000 11110010 

je désignerai bits dans un octet par la offsets suivants: [] Le premier octet 10111101 contient le end of block au décalage 0, le décalage 21 contient les deux bits qui déterminent le type de bloc.
Dans ce cas, c'est le dernier bloc, et c'est un arbre Huffman dynamique.

Les bits suivants à interpréter sont le nombre de codes littéraux (5 bits), de distance (5 bits) et de longueur (4 bits). Ils sont lus comme suit:

10111101 -> 10111XXX -> 23 (literal) 
00011011 -> XXX11011 -> 27 (distance) 
00011011 11111101 -> 000XXXXX XXXXXXX1 -> 1000 -> 8 (length) 

Après ce point, j'ai des problèmes. Les 36 bits suivants devraient être 12 ensembles de 3 bits qui indiquent les longueurs de code.
A partir des octets ci-dessus, je vois (interprété comme little-endian):

110 111 111 011 011 010 011 011 100 100 101 100 
3 7 7 6 6 2 6 6 1 1 5 1 

Mais j'attendre (comme indiqué dans le lien ci-dessus)

101 011 011 110 110 110 110 110 110 001 001 001 
5 6 6 3 3 3 3 3 3 4 4 4 

Je ne vois aucune façon de obtenir ces valeurs à partir du fichier. Je dois mal interpréter comment les bits doivent être lus. Étant donné un octet avec une valeur de 5 bits suivie par une valeur de 3 bits, [CBA] je le lirais comme et ABC.

L'article est-il erroné quant à la longueur correcte du code, ou plus probablement, ai-je tort sur la façon dont ils doivent être interprétés?

Répondre

1
se sont lues

les bits LSB MSB comme illustré sur la figure 6:

<---- 
87654321 

(du document lié par la question) indique que

[CBA] Je lire commeet ABC.

(à partir de la question elle-même) est correct.

Little-endian signifie que les chiffres les moins significatifs (ici, les bits) sont stockés ou lus (ici, interprétés) en premier.

Cependant, et ABC sont eux-mêmes en petit-boutiste, donc l'octet 110 11000 serait interprété comme 3 3, non 24 6.

Cela signifie que les cinq, cinq et quatre bits

10111101 00011011 ... 

sont

xxx11101 => 11101 => 29 
101xxxxx 
xxxxxx11 => 11 101 => 29 
xx0110xx => 0110 => 6 
+0

Merci, a fait quelques tests. Géré pour décompresser la plupart du fichier correctement (mon programme a rencontré un bug que je dois corriger.) Mais il s'avère que la table d'origine que j'ai réussi à obtenir était correcte. L'article a donné le mauvais ensemble de longueurs de code. – kieve

Questions connexes