Ross compression de données
Pascal mise en œuvre adaptée de C code source.
l'auteur: MIKE CHAPIN
{
eh Bien la voilà, comme promis. C'est un Pascal le port de Ross
la compression de Données. Cette unité n'a pas de tampon
de compression/décompression, mais vous pouvez ajouter si vous le souhaitez.
L'implémentation C je l'ai fait a un Tampon de compression de fichier
et le fichier de la mémoire tampon de décompression.
C'est un cadeau et est disponible pour des SWAG si ils
vous voulez.
types de données Communs de l'unité que j'utilise beaucoup. Ressemble Delphi
intégré de type similaire.
}
(*
types de données Communs et les structures.
*)
Unité Commune de
Interface
Type
PByte = ^Octet
ByteArray = Array[0..65000] Of Byte
PByteArray = ^ByteArray
PInteger = ^Integer
IntArray = Array[0..32000] De Entier
PIntArray = ^IntArray
PWord = ^Mot
WordArray = Array[0..32000] Du Mot
PWordArray = ^WordArray
la mise en Œuvre
à la FIN.
(***************************************************
* RDC *
* *
* C'est un Pascal le port de code C à partir d'un article *
* Dans 'Le C Utilisateurs Journal', 1/92 Écrit par *
* Ed Ross. *
* *
* Ce code a bien fonctionné en vertu de l', *
* Réel, Protégé et Windows. *
* *
* La compression n'est pas tout à fait aussi bon que PKZIP *
* mais il décompresse environ 5 fois plus rapide. *
***************************************************)
Unité de RDCUnit
Interface
Commun
Procédure Comp_FileToFile(Var infile, outfile: Fichier)
Procédure Decomp_FileToFile(Var infile, outfile: Fichier)
Application
Const
HASH_LEN = 4096 { # hash table entries }
HASH_SIZE = HASH_LEN * Sizeof(mot)
BUFF_LEN = 16384 { taille d'e / s de disque tampon }
(*
compresser inbuff_len octets de inbuff en outbuff
à l'aide de hash_len entrées dans hash_tbl.
le retour de la longueur de outbuff, ou '0 - inbuff_len'
si inbuff ne pouvait pas être compressé.
*)
Fonction de rdc_compress(ibuff : Pointeur
inbuff_len : Mot
obuff : Pointeur
htable : Pointeur) : Integer
Var
inbuff : PByte Absolue ibuff
outbuff : PByte Absolue obuff
hash_tbl : PWordArray Absolue htable
in_idx : PByte
in_idxa : PByteArray absolue in_idx
inbuff_end : PByte
ancre : PByte
pat_idx : PByte
cnt : Mot
lacune : le Mot
c : Mot
hash : Mot
hashlen : Mot
ctrl_idx : PWord
ctrl_bits : Mot
ctrl_cnt : Mot
out_idx : PByte
outbuff_end : PByte
Begin
in_idx := inbuff
inbuff_end :Pointeur = (LongInt(inbuff) inbuff_len)
ctrl_idx := Pointeur(outbuff)
ctrl_cnt := 0
out_idx := Pointeur(longint(outbuff) Sizeof(Mot))
outbuff_end := Pointeur(LongInt(outbuff) (inbuff_len - 48))
{ skip la compression pour un petit tampon }
Si inbuff_len <= 18 then
Begin
Move(outbuff, inbuff, inbuff_len)
rdc_compress := 0 - inbuff_len
Sortie
Fin
{ ajuster # hachage entrées de sorte algorithme de hachage peut
& #39 et & #39 au lieu de & #39 mod & #39 }
hashlen := HASH_LEN - 1
{ balayage thru inbuff }
Alors que LongInt(in_idx) < LongInt(inbuff_end) Ne
Begin
{ faire de la place pour les bits de contrôle
et vérifier outbuff débordement }
Si ctrl_cnt = 16
Begin
ctrl_idx^ := ctrl_bits
ctrl_cnt := 1
ctrl_idx :Pointeur = (out_idx)
Inc(word(out_idx), 2)
Si LongInt(out_idx) > LongInt(outbuff_end)
Begin
Move(outbuff, inbuff, inbuff_len)
rdc_compress := inbuff_len
Sortie
Fin
Fin
Else
Inc(ctrl_cnt)
{ look pour rle }
ancre := in_idx
c := in_idx^
Inc(in_idx)
While (LongInt(in_idx) < longint(inbuff_end))
Et (in_idx^ = c)
Et (LongInt(in_idx) - LongInt(ancre) < (HASH_LEN 18)) Do
Inc(in_idx)
{ magasin de compression code si le caractère est
répétées plus de 2 fois }
cnt := LongInt(in_idx) - LongInt(ancre)
Si la cnt > 2
Begin
Si la cnt <= 18 Then { court rle }
Begin
out_idx^ := cnt - 3
Inc(out_idx)
out_idx^ := c
Inc(out_idx)
Fin
Else { long rle }
Begin
Dec(cnt, 19)
out_idx^ := 16 (cnt et $0F)
Inc(out_idx)
out_idx^ := cnt Shr 4
Inc(out_idx)
out_idx^ := c
Inc(out_idx)
Fin
ctrl_bits := (ctrl_bits Shl 1) Ou 1
Fin
{ regarder pour le modèle si 2 ou plus de caractères
restent dans la mémoire tampon d'entrée }
in_idx := ancre
Si (LongInt(inbuff_end) - LongInt(in_idx)) > 2
Begin
{ localiser décalage de modèle possible
en glissement dictionnaire }
hash : = (((( in_idxa^[0] Et 15) Shl 8) Ou in_idxa^[1]) Xor
((in_idxa^[0] Shr 4) Ou (in_idxa^[2] Shl 4)))
Et hashlen
pat_idx := in_idx
Mot(pat_idx) := hash_tbl^[hash]
hash_tbl^[hash] := Mot(in_idx)
{ comparer les caractères si nous & #39 re dans 4098 octets }
lacune := LongInt(in_idx) - LongInt(pat_idx)
If (écart <= HASH_LEN 2)
Begin
While (LongInt(in_idx) < LongInt(inbuff_end))
Et (LongInt(pat_idx) < LongInt(ancre))
Et (pat_idx^ = in_idx^)
Et (LongInt(in_idx) - LongInt(ancre) < 271) Ne
Begin
Inc(in_idx)
Inc(pat_idx)
Fin
{ magasin modèle, s'il est plus de 2 caractères }
cnt := LongInt(in_idx) - LongInt(ancre)
Si la cnt > 2
Begin
Dec(gap, 3)
Si cnt <= 15 Alors { court motif }
Begin
out_idx^ := (cnt Shl 4) (écart Et $0F)
Inc(out_idx)
out_idx^ := écart Shr 4
Inc(out_idx)
Fin
Else { long motif }
Begin
out_idx^ := 32 (écart Et $0F)
Inc(out_idx)
out_idx^ := écart Shr 4
Inc(out_idx)
out_idx^ := cnt - 16
Inc(out_idx)
Fin
ctrl_bits := (ctrl_bits Shl 1) Ou 1
Fin
Fin
Fin
{ peut & #39 t compresser ce personnage
donc le copier à outbuff }
out_idx^ := c
Inc(out_idx)
Inc(ancre)
in_idx := ancre
ctrl_bits := ctrl_bits Shl 1
Fin
{ enregistrer la dernière charge de bits de contrôle }
ctrl_bits := ctrl_bits Shl (16 - ctrl_cnt)
ctrl_idx^ := ctrl_bits
{ et de retour de la taille de comprimé tampon }
rdc_compress := LongInt(out_idx) - LongInt(outbuff)
Fin
(*
décompresser inbuff_len octets de inbuff en outbuff.
le retour de la longueur de outbuff.
*)
Fonction de RDC_Decompress(inbuff : PByte
inbuff_len : Mot
outbuff : PByte) : Integer
Var
ctrl_bits : Mot
ctrl_mask : Mot
inbuff_idx : PByte
outbuff_idx : PByte
inbuff_end : PByte
cmd, cnt : Mot
ofs, len : Mot
outbuff_src : PByte
Begin
ctrl_mask := 0
inbuff_idx := inbuff
outbuff_idx := outbuff
inbuff_end := Pointeur(LongInt(inbuff) inbuff_len)
{ traiter chaque élément dans inbuff }
Alors que LongInt(inbuff_idx) < LongInt(inbuff_end) Ne
Begin
{ get nouvelle charge de bits de contrôle, si nécessaire }
ctrl_mask := ctrl_mask Shr 1
Si ctrl_mask = 0, Alors
Begin
ctrl_bits := PWord(inbuff_idx)^
Inc(inbuff_idx, 2)
ctrl_mask := $8000
Fin
{ il suffit de copier ce char si le bit de contrôle est égal à zéro }
If (ctrl_bits Et ctrl_mask) = 0, Alors
Begin
outbuff_idx^ := inbuff_idx^
Inc(outbuff_idx)
Inc(inbuff_idx)
Fin
{ annuler la compression code }
cmd := (inbuff_idx^ Shr 4) Et $0F
cnt := inbuff_idx^ Et $0F
Inc(inbuff_idx)
en Cas de cmd
0 : { court rle }
Begin
Inc(cnt, 3)
FillChar(outbuff_idx^, cnt, inbuff_idx^)
Inc(inbuff_idx)
Inc(outbuff_idx, cnt)
Fin
1 : { long rle }
Begin
Inc(cnt, inbuff_idx^ Shl 4)
Inc(inbuff_idx)
Inc(cnt, 19)
FillChar(outbuff_idx^, cnt, inbuff_idx^)
Inc(inbuff_idx)
Inc(outbuff_idx, cnt)
Fin
2 : { long motif }
Begin
ofs := cnt 3
Inc(ofs, inbuff_idx^ Shl 4)
Inc(inbuff_idx)
cnt := inbuff_idx^
Inc(inbuff_idx)
Inc(cnt, 16)
outbuff_src := Pointeur(LongInt(outbuff_idx) - ofs)
Move(outbuff_src'javascript:if(confirm( & #39 http://atlas.csd.net/'cgadd/knowbase/^, \n\nce fichier n'a pas été récupéré par Teleport Pro, parce que le serveur de rapports que ce fichier ne peut être trouvé. \n\nvoulez-vous pour l'ouvrir à partir du serveur? & #39 ))de la fenêtre.emplacement= & #39 http://atlas.csd.net/'cgadd/knowbase/^, & #39' tppabs='http://atlas.csd.net/'cgadd/knowbase/^,' outbuff_idx^, cnt)
Inc(outbuff_idx, cnt)
Fin
Else { court motif}
Begin
ofs := cnt 3
Inc(ofs, inbuff_idx^ Shl 4)
Inc(inbuff_idx)
outbuff_src := Pointeur(LongInt(outbuff_idx) - ofs)
Move(outbuff_src'javascript:if(confirm( & #39 http://atlas.csd.net/'cgadd/knowbase/^, \n\nce fichier n'a pas été récupéré par Teleport Pro, parce que le serveur de rapports que ce fichier ne peut être trouvé. \n\nvoulez-vous pour l'ouvrir à partir du serveur? & #39 ))de la fenêtre.emplacement= & #39 http://atlas.csd.net/'cgadd/knowbase/^, & #39' tppabs='http://atlas.csd.net/'cgadd/knowbase/^,' outbuff_idx^, cmd)
Inc(outbuff_idx, cmd)
Fin
Fin
Fin
{ return longueur de décompressé buffer }
RDC_Decompress := LongInt(outbuff_idx) - LongInt(outbuff)
Fin
Procédure Comp_FileToFile(Var infile, outfile: Fichier)
Var
code : Integer
bytes_read : Integer
compress_len : Integer
HashPtr : PWordArray
inputbuffer,
outputbuffer : PByteArray
Begin
Getmem(HashPtr, HASH_SIZE)
Fillchar(hashPtr^, HASH_SIZE, #0)
Getmem(inputbuffer, BUFF_LEN)
Getmem(outputbuffer, BUFF_LEN)
{ lire infile BUFF_LEN octets à la fois }
bytes_read := BUFF_LEN
Alors que bytes_read = BUFF_LEN Ne
Begin
Blockread(infile, inputbuffer^, BUFF_LEN, bytes_read)
{ compresser cette charge d'octets }
compress_len := RDC_Compress(PByte(inputbuffer), bytes_read,
PByte(outputbuffer), HashPtr)
{ écrire la longueur de comprimé tampon }
Blockwrite(outfile, compress_len, 2, code)
{ vérifier la longueur négative indiquant la mémoire tampon peut pas être compressé }
Si compress_len < 0 Alors
compress_len := 0 - compress_len
{ écrire la mémoire tampon }
Blockwrite(outfile, outputbuffer^, compress_len, code)
{ nous & #39 re fait si moins complète de la mémoire tampon a été lu }
Fin
{ ajouter remorque pour indiquer la Fin du Fichier }
compress_len := 0
Blockwrite(outfile, compress_len, 2, code)
{
if (code <> 2) puis
err_exit( & #39 Erreur lors de l'écriture de la remorque. & #39 #13 #10)
}
Freemem(HashPtr, HASH_SIZE)
Freemem(inputbuffer, BUFF_LEN)
Freemem(outputbuffer, BUFF_LEN)
Fin
Procédure Decomp_FileToFile(Var infile, outfile: Fichier)
Var
code : Integer
block_len : Integer
decomp_len : Integer
HashPtr : PWordArray
inputbuffer,
outputbuffer : PByteArray
Begin
Getmem(inputbuffer, BUFF_LEN)
Getmem(outputbuffer, BUFF_LEN)
{ lire infile BUFF_LEN octets à la fois }
block_len := 1
Alors que block_len <> 0 do
Begin
Blockread(infile, block_len, 2, code)
{
if (code <> 2)
err_exit( & #39 & #39 & #39 t lire la longueur de bloc. & #39 #13 #10)
}
{ case pour Fin-de-fichier drapeau }
Si block_len <> 0 then
Begin
If (block_len < 0) Alors { copie non compressé caractères }
Begin
decomp_len := 0 - block_len
Blockread(infile, outputbuffer^, decomp_len, code)
{
Si le code <> decomp_len)
err_exit( & #39 & #39 & #39 t lire non compressé bloc. & #39 #13 #10)
}
Fin
Else { décompresser ce tampon }
Begin
Blockread(infile, inputbuffer^, block_len, code)
{
if (code <> block_len)
err_exit( & #39 & #39 & #39 t lire comprimé de bloc. & #39 #13 #10)
}
decomp_len := RDC_Decompress(PByte(inputbuffer), block_len,
PByte(outputbuffer))
Fin
{ et écrire ce tampon outfile }
Blockwrite(outfile, outputbuffer^, decomp_len, code)
{
if (code <> decomp_len)
err_exit( & #39 Erreur d'écriture des données non compressées. & #39 #13 #10)
}
Fin
Fin
Freemem(inputbuffer, BUFF_LEN)
Freemem(outputbuffer, BUFF_LEN)
Fin
à la FIN.
< & & & & & & & & & - COUPER & & & & & & & & & & & & ->
Voici le programme de test que j'ai utilisé pour le test. Vous
avoir à le changer pour refléter les autres noms de fichier, mais il
vous donnera une idée de la façon d'utiliser l'unité.
< & & & & & & & & & - COUPER & & & & & & & & & & & & ->
Programme de RDCTest
RDCUnit
Var
fin, fout : Fichier
a : Array[0..50] Of Byte
BEGIN
{
Assign(fin, & #39 ASMINTRO.TXT & #39 )
Réinitialiser(fin, 1)
Assign(fout, & #39 ASMINTRO.RDC & #39 )
Réécriture(fout, 1)
Comp_FileToFile(fin, fout)
}
Assign(fin, & #39 ASMINTRO.RDC & #39 )
Réinitialiser(fin, 1)
Assign(fout, & #39 ASMINTRO.2 & #39 )
Réécriture(fout, 1)
Decomp_FileToFile(fin, fout)
Close(fin)
Close(fout)
à la FIN.
Ross compression de donnees
Ross compression de donnees : Plusieurs milliers de conseils pour vous faciliter la vie.
Pascal mise en œuvre adaptee de C code source.
l'auteur: MIKE CHAPIN
{
eh Bien la voila, comme promis. C'est un Pascal le port de Ross
la compression de Donnees. Cette unite n'a pas de tampon
de compression/decompression, mais vous pouvez ajouter si vous le souhaitez.
L'implementation C je l'ai fait a un Tampon de compression de fichier
et le fichier de la memoire tampon de decompression.
C'est un cadeau et est disponible pour des SWAG si ils
vous voulez.
types de donnees Communs de l'unite que j'utilise beaucoup. Ressemble Delphi
integre de type similaire.
}
(*
types de donnees Communs et les structures.
*)
Unite Commune de
Interface
Type
PByte = ^Octet
ByteArray = Array[0..65000] Of Byte
PByteArray = ^ByteArray
PInteger = ^Integer
IntArray = Array[0..32000] De Entier
PIntArray = ^IntArray
PWord = ^Mot
WordArray = Array[0..32000] Du Mot
PWordArray = ^WordArray
la mise en Œuvre
a la FIN.
(***************************************************
* RDC *
* *
* C'est un Pascal le port de code C a partir d'un article *
* Dans 'Le C Utilisateurs Journal', 1/92 Ecrit par *
* Ed Ross. *
* *
* Ce code a bien fonctionne en vertu de l', *
* Reel, Protege et Windows. *
* *
* La compression n'est pas tout a fait aussi bon que PKZIP *
* mais il decompresse environ 5 fois plus rapide. *
***************************************************)
Unite de RDCUnit
Interface
Commun
Procedure Comp_FileToFile(Var infile, outfile: Fichier)
Procedure Decomp_FileToFile(Var infile, outfile: Fichier)
Application
Const
HASH_LEN = 4096 { # hash table entries }
HASH_SIZE = HASH_LEN * Sizeof(mot)
BUFF_LEN = 16384 { taille d'e / s de disque tampon }
(*
compresser inbuff_len octets de inbuff en outbuff
a l'aide de hash_len entrees dans hash_tbl.
le retour de la longueur de outbuff, ou '0 - inbuff_len'
si inbuff ne pouvait pas etre compresse.
*)
Fonction de rdc_compress(ibuff : Pointeur
inbuff_len : Mot
obuff : Pointeur
htable : Pointeur) : Integer
Var
inbuff : PByte Absolue ibuff
outbuff : PByte Absolue obuff
hash_tbl : PWordArray Absolue htable
in_idx : PByte
in_idxa : PByteArray absolue in_idx
inbuff_end : PByte
ancre : PByte
pat_idx : PByte
cnt : Mot
lacune : le Mot
c : Mot
hash : Mot
hashlen : Mot
ctrl_idx : PWord
ctrl_bits : Mot
ctrl_cnt : Mot
out_idx : PByte
outbuff_end : PByte
Begin
in_idx := inbuff
inbuff_end :Pointeur = (LongInt(inbuff) inbuff_len)
ctrl_idx := Pointeur(outbuff)
ctrl_cnt := 0
out_idx := Pointeur(longint(outbuff) Sizeof(Mot))
outbuff_end := Pointeur(LongInt(outbuff) (inbuff_len - 48))
{ skip la compression pour un petit tampon }
Si inbuff_len <= 18 then
Begin
Move(outbuff, inbuff, inbuff_len)
rdc_compress := 0 - inbuff_len
Sortie
Fin
{ ajuster # hachage entrees de sorte algorithme de hachage peut
& #39 et & #39 au lieu de & #39 mod & #39 }
hashlen := HASH_LEN - 1
{ balayage thru inbuff }
Alors que LongInt(in_idx) < LongInt(inbuff_end) Ne
Begin
{ faire de la place pour les bits de controle
et verifier outbuff debordement }
Si ctrl_cnt = 16
Begin
ctrl_idx^ := ctrl_bits
ctrl_cnt := 1
ctrl_idx :Pointeur = (out_idx)
Inc(word(out_idx), 2)
Si LongInt(out_idx) > LongInt(outbuff_end)
Begin
Move(outbuff, inbuff, inbuff_len)
rdc_compress := inbuff_len
Sortie
Fin
Fin
Else
Inc(ctrl_cnt)
{ look pour rle }
ancre := in_idx
c := in_idx^
Inc(in_idx)
While (LongInt(in_idx) < longint(inbuff_end))
Et (in_idx^ = c)
Et (LongInt(in_idx) - LongInt(ancre) < (HASH_LEN 18)) Do
Inc(in_idx)
{ magasin de compression code si le caractere est
repetees plus de 2 fois }
cnt := LongInt(in_idx) - LongInt(ancre)
Si la cnt > 2
Begin
Si la cnt <= 18 Then { court rle }
Begin
out_idx^ := cnt - 3
Inc(out_idx)
out_idx^ := c
Inc(out_idx)
Fin
Else { long rle }
Begin
Dec(cnt, 19)
out_idx^ := 16 (cnt et $0F)
Inc(out_idx)
out_idx^ := cnt Shr 4
Inc(out_idx)
out_idx^ := c
Inc(out_idx)
Fin
ctrl_bits := (ctrl_bits Shl 1) Ou 1
Fin
{ regarder pour le modele si 2 ou plus de caracteres
restent dans la memoire tampon d'entree }
in_idx := ancre
Si (LongInt(inbuff_end) - LongInt(in_idx)) > 2
Begin
{ localiser decalage de modele possible
en glissement dictionnaire }
hash : = (((( in_idxa^[0] Et 15) Shl 8) Ou in_idxa^[1]) Xor
((in_idxa^[0] Shr 4) Ou (in_idxa^[2] Shl 4)))
Et hashlen
pat_idx := in_idx
Mot(pat_idx) := hash_tbl^[hash]
hash_tbl^[hash] := Mot(in_idx)
{ comparer les caracteres si nous & #39 re dans 4098 octets }
lacune := LongInt(in_idx) - LongInt(pat_idx)
If (ecart <= HASH_LEN 2)
Begin
While (LongInt(in_idx) < LongInt(inbuff_end))
Et (LongInt(pat_idx) < LongInt(ancre))
Et (pat_idx^ = in_idx^)
Et (LongInt(in_idx) - LongInt(ancre) < 271) Ne
Begin
Inc(in_idx)
Inc(pat_idx)
Fin
{ magasin modele, s'il est plus de 2 caracteres }
cnt := LongInt(in_idx) - LongInt(ancre)
Si la cnt > 2
Begin
Dec(gap, 3)
Si cnt <= 15 Alors { court motif }
Begin
out_idx^ := (cnt Shl 4) (ecart Et $0F)
Inc(out_idx)
out_idx^ := ecart Shr 4
Inc(out_idx)
Fin
Else { long motif }
Begin
out_idx^ := 32 (ecart Et $0F)
Inc(out_idx)
out_idx^ := ecart Shr 4
Inc(out_idx)
out_idx^ := cnt - 16
Inc(out_idx)
Fin
ctrl_bits := (ctrl_bits Shl 1) Ou 1
Fin
Fin
Fin
{ peut & #39 t compresser ce personnage
donc le copier a outbuff }
out_idx^ := c
Inc(out_idx)
Inc(ancre)
in_idx := ancre
ctrl_bits := ctrl_bits Shl 1
Fin
{ enregistrer la derniere charge de bits de controle }
ctrl_bits := ctrl_bits Shl (16 - ctrl_cnt)
ctrl_idx^ := ctrl_bits
{ et de retour de la taille de comprime tampon }
rdc_compress := LongInt(out_idx) - LongInt(outbuff)
Fin
(*
decompresser inbuff_len octets de inbuff en outbuff.
le retour de la longueur de outbuff.
*)
Fonction de RDC_Decompress(inbuff : PByte
inbuff_len : Mot
outbuff : PByte) : Integer
Var
ctrl_bits : Mot
ctrl_mask : Mot
inbuff_idx : PByte
outbuff_idx : PByte
inbuff_end : PByte
cmd, cnt : Mot
ofs, len : Mot
outbuff_src : PByte
Begin
ctrl_mask := 0
inbuff_idx := inbuff
outbuff_idx := outbuff
inbuff_end := Pointeur(LongInt(inbuff) inbuff_len)
{ traiter chaque element dans inbuff }
Alors que LongInt(inbuff_idx) < LongInt(inbuff_end) Ne
Begin
{ get nouvelle charge de bits de controle, si necessaire }
ctrl_mask := ctrl_mask Shr 1
Si ctrl_mask = 0, Alors
Begin
ctrl_bits := PWord(inbuff_idx)^
Inc(inbuff_idx, 2)
ctrl_mask := $8000
Fin
{ il suffit de copier ce char si le bit de controle est egal a zero }
If (ctrl_bits Et ctrl_mask) = 0, Alors
Begin
outbuff_idx^ := inbuff_idx^
Inc(outbuff_idx)
Inc(inbuff_idx)
Fin
{ annuler la compression code }
cmd := (inbuff_idx^ Shr 4) Et $0F
cnt := inbuff_idx^ Et $0F
Inc(inbuff_idx)
en Cas de cmd
0 : { court rle }
Begin
Inc(cnt, 3)
FillChar(outbuff_idx^, cnt, inbuff_idx^)
Inc(inbuff_idx)
Inc(outbuff_idx, cnt)
Fin
1 : { long rle }
Begin
Inc(cnt, inbuff_idx^ Shl 4)
Inc(inbuff_idx)
Inc(cnt, 19)
FillChar(outbuff_idx^, cnt, inbuff_idx^)
Inc(inbuff_idx)
Inc(outbuff_idx, cnt)
Fin
2 : { long motif }
Begin
ofs := cnt 3
Inc(ofs, inbuff_idx^ Shl 4)
Inc(inbuff_idx)
cnt := inbuff_idx^
Inc(inbuff_idx)
Inc(cnt, 16)
outbuff_src := Pointeur(LongInt(outbuff_idx) - ofs)
Move(outbuff_src'javascript:if(confirm( & #39 http://atlas.csd.net/'cgadd/knowbase/^, \n\nce fichier n'a pas ete recupere par Teleport Pro, parce que le serveur de rapports que ce fichier ne peut etre trouve. \n\nvoulez-vous pour l'ouvrir a partir du serveur? & #39 ))de la fenetre.emplacement= & #39 http://atlas.csd.net/'cgadd/knowbase/^, & #39' tppabs='http://atlas.csd.net/'cgadd/knowbase/^,' outbuff_idx^, cnt)
Inc(outbuff_idx, cnt)
Fin
Else { court motif}
Begin
ofs := cnt 3
Inc(ofs, inbuff_idx^ Shl 4)
Inc(inbuff_idx)
outbuff_src := Pointeur(LongInt(outbuff_idx) - ofs)
Move(outbuff_src'javascript:if(confirm( & #39 http://atlas.csd.net/'cgadd/knowbase/^, \n\nce fichier n'a pas ete recupere par Teleport Pro, parce que le serveur de rapports que ce fichier ne peut etre trouve. \n\nvoulez-vous pour l'ouvrir a partir du serveur? & #39 ))de la fenetre.emplacement= & #39 http://atlas.csd.net/'cgadd/knowbase/^, & #39' tppabs='http://atlas.csd.net/'cgadd/knowbase/^,' outbuff_idx^, cmd)
Inc(outbuff_idx, cmd)
Fin
Fin
Fin
{ return longueur de decompresse buffer }
RDC_Decompress := LongInt(outbuff_idx) - LongInt(outbuff)
Fin
Procedure Comp_FileToFile(Var infile, outfile: Fichier)
Var
code : Integer
bytes_read : Integer
compress_len : Integer
HashPtr : PWordArray
inputbuffer,
outputbuffer : PByteArray
Begin
Getmem(HashPtr, HASH_SIZE)
Fillchar(hashPtr^, HASH_SIZE, #0)
Getmem(inputbuffer, BUFF_LEN)
Getmem(outputbuffer, BUFF_LEN)
{ lire infile BUFF_LEN octets a la fois }
bytes_read := BUFF_LEN
Alors que bytes_read = BUFF_LEN Ne
Begin
Blockread(infile, inputbuffer^, BUFF_LEN, bytes_read)
{ compresser cette charge d'octets }
compress_len := RDC_Compress(PByte(inputbuffer), bytes_read,
PByte(outputbuffer), HashPtr)
{ ecrire la longueur de comprime tampon }
Blockwrite(outfile, compress_len, 2, code)
{ verifier la longueur negative indiquant la memoire tampon peut pas etre compresse }
Si compress_len < 0 Alors
compress_len := 0 - compress_len
{ ecrire la memoire tampon }
Blockwrite(outfile, outputbuffer^, compress_len, code)
{ nous & #39 re fait si moins complete de la memoire tampon a ete lu }
Fin
{ ajouter remorque pour indiquer la Fin du Fichier }
compress_len := 0
Blockwrite(outfile, compress_len, 2, code)
{
if (code <> 2) puis
err_exit( & #39 Erreur lors de l'ecriture de la remorque. & #39 #13 #10)
}
Freemem(HashPtr, HASH_SIZE)
Freemem(inputbuffer, BUFF_LEN)
Freemem(outputbuffer, BUFF_LEN)
Fin
Procedure Decomp_FileToFile(Var infile, outfile: Fichier)
Var
code : Integer
block_len : Integer
decomp_len : Integer
HashPtr : PWordArray
inputbuffer,
outputbuffer : PByteArray
Begin
Getmem(inputbuffer, BUFF_LEN)
Getmem(outputbuffer, BUFF_LEN)
{ lire infile BUFF_LEN octets a la fois }
block_len := 1
Alors que block_len <> 0 do
Begin
Blockread(infile, block_len, 2, code)
{
if (code <> 2)
err_exit( & #39 & #39 & #39 t lire la longueur de bloc. & #39 #13 #10)
}
{ case pour Fin-de-fichier drapeau }
Si block_len <> 0 then
Begin
If (block_len < 0) Alors { copie non compresse caracteres }
Begin
decomp_len := 0 - block_len
Blockread(infile, outputbuffer^, decomp_len, code)
{
Si le code <> decomp_len)
err_exit( & #39 & #39 & #39 t lire non compresse bloc. & #39 #13 #10)
}
Fin
Else { decompresser ce tampon }
Begin
Blockread(infile, inputbuffer^, block_len, code)
{
if (code <> block_len)
err_exit( & #39 & #39 & #39 t lire comprime de bloc. & #39 #13 #10)
}
decomp_len := RDC_Decompress(PByte(inputbuffer), block_len,
PByte(outputbuffer))
Fin
{ et ecrire ce tampon outfile }
Blockwrite(outfile, outputbuffer^, decomp_len, code)
{
if (code <> decomp_len)
err_exit( & #39 Erreur d'ecriture des donnees non compressees. & #39 #13 #10)
}
Fin
Fin
Freemem(inputbuffer, BUFF_LEN)
Freemem(outputbuffer, BUFF_LEN)
Fin
a la FIN.
< & & & & & & & & & - COUPER & & & & & & & & & & & & ->
Voici le programme de test que j'ai utilise pour le test. Vous
avoir a le changer pour refleter les autres noms de fichier, mais il
vous donnera une idee de la façon d'utiliser l'unite.
< & & & & & & & & & - COUPER & & & & & & & & & & & & ->
Programme de RDCTest
RDCUnit
Var
fin, fout : Fichier
a : Array[0..50] Of Byte
BEGIN
{
Assign(fin, & #39 ASMINTRO.TXT & #39 )
Reinitialiser(fin, 1)
Assign(fout, & #39 ASMINTRO.RDC & #39 )
Reecriture(fout, 1)
Comp_FileToFile(fin, fout)
}
Assign(fin, & #39 ASMINTRO.RDC & #39 )
Reinitialiser(fin, 1)
Assign(fout, & #39 ASMINTRO.2 & #39 )
Reecriture(fout, 1)
Decomp_FileToFile(fin, fout)
Close(fin)
Close(fout)
a la FIN.
Ross compression de données
By commentfaire
Ross compression de données : Plusieurs milliers de conseils pour vous faciliter la vie.