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?
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