probleme Compression d'entier, de texte

probleme Compression d'entier, de texte - C - Programmation

Marsh Posté le 30-08-2007 à 17:00:53    

Bonjour tout le monde, j'aurai besoin d'aide j'ai un petit problème au niveau de la compression. Je ne connais pas trop le principe,
je sais juste qu'il faut que je convertisse l'entier par exemple en binaire et que je le cast ensuite dans un char ... enfin je pense, d'ailleur je ne sais pas trop comment on s'y prend avec les manipulations de bit et autre .
 
Un proffesseur nous a balancé un programme qui compresse et ecrit dans un fichier sans trop nous expliquer ce qu'il fait ...
avec des décalages de bit des &,|,! et autres ...  
si quelqu'un pouvait m'aider a le comprendre je vous en serais reconnaissant ^^
 
 
void g(unsigned int n, int octet,FILE *F){
 if(n<1<<7){
  unsigned char c=(unsigned char)n;
  if(octet!=0)
   c=c|1<<7;
  fputc(c,F);
  return;
 }
 g(n>>7,octet+1,F);
 g(n&127,octet,F);
}
 
Merci  

Reply

Marsh Posté le 30-08-2007 à 17:00:53   

Reply

Marsh Posté le 30-08-2007 à 18:43:17    

k3nsou a écrit :

Bonjour tout le monde, j'aurai besoin d'aide j'ai un petit problème au niveau de la compression. Je ne connais pas trop le principe,
je sais juste qu'il faut que je convertisse l'entier par exemple en binaire et que je le cast ensuite dans un char ... enfin je pense, d'ailleur je ne sais pas trop comment on s'y prend avec les manipulations de bit et autre .
 
Un proffesseur nous a balancé un programme qui compresse et ecrit dans un fichier sans trop nous expliquer ce qu'il fait ...
avec des décalages de bit des &,|,! et autres ...  
si quelqu'un pouvait m'aider a le comprendre je vous en serais reconnaissant ^^
 
 
void g(unsigned int n, int octet,FILE *F){
 if(n<1<<7){
  unsigned char c=(unsigned char)n;
  if(octet!=0)
   c=c|1<<7;
  fputc(c,F);
  return;
 }
 g(n>>7,octet+1,F);
 g(n&127,octet,F);
}
 
Merci  


 
Bah c'est une fonction salement récursive (chaque appel va en générer 2 autres)

  • 1 << 7 correspond à 1 * 2^7 soit au nombre 128 (on se demande pourquoi ton prof n'écrit pas directement n < 128 (ou mieux 0x80 en hexa) => ptet pour se donner un genre "jmaîtrise" ) => donc si "n" est inférieur à 128, il va se passer ça:
  • c=c|1<<7 => ou bit à bit entre c et 128 => quelle que soit la valeur qui en sort, tu peux être certain qu'elle est au-moins égale à 128
  • écriture de cette valeur dans le fichier
  • fin de la récursivité

=> sinon

  • appel récursif pour le 8° bit de n
  • appel récursif pour les 7 autres bits de n


Voilà. Maintenant quelle est la théorie mathématique qui a servi de base à un tel algo => je n'en sais rien


Message édité par Sve@r le 30-08-2007 à 19:28:21

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 31-08-2007 à 00:59:33    

merci beaucoup j'y vois un peu plus clair en ce qui concerne l'action des lignes de code de ce programme.
mais je n'ai pas compris en quoi il compresse ...  
si quelqu'un pouvait m'expliquer ce qu'est exactement la compression d'un entier  
(les différentes étapes qu'il faut a la compression de celui-ci et a quoi il faut aboutir),  
j'ai essayé de chercher sur le net mais rien à faire je ne trouve rien qui pourrait m'aider :/
 
merci d'avance^! ^^
 
 

Reply

Marsh Posté le 31-08-2007 à 13:24:35    

C'est bidon comme compression mais bon j'imagine que l'intéret c'est de montrer une fonction récursive et la manipulation de bits... En gros tu passe à ta fonction un entier n à écrire dans un fichier F. octet vaut 0 initialement. Bon pour fixer les idées on va dire qu'un int fait 4 char, et qu'un char fait 8 bits (ce qui est souvent le cas).
 
La fonction écrit ton int sous la forme d'un certain nombre de char. Si n tiens sur 7 bits, elle écrit n sous la forme de 8 bits (soit 1 char) dans le fichier. Si n ne tient pas sur 7 bits écrit dans le fichier les 7 bits de poids faibles, plus un 8ème bit qui en l'occurence est mis à 0. Et elle recommence pour les 32 - 7 = 25 bits de poid fort de n. Sauf que ce coup là quand elle écrit 7 bits dans le fichier plus un 8ème bit, le 8ème bit est mis à 1 pour indiquer à celui qui lira le fichier que l'octet qui est en train d'etre lu n'est pas le début d'un nouvel entier, mais la suite d'un entier dont on a déjà lu un ou plusieurs morceaux de 7 bits.
 
Donc au final, ta fonction va écrire un entier n (32 bits) en utilisant de 8 à 40 bits. Donc si tu as de la chance ça compresse un peu, si tu n'as pas de chance ça fait grossir le fichier.
 
Voilà bon j'ai pas trops réfléchi donc les détail c'est peut-être pas tout à fait ça, mais c'est l'idée.
 
Edit : si je ne me trompe pas ça code en moyenne un int sur 39,49 bits. Donc sur des données aléatoires, ça augmente en moyenne la taille du fichier de 23%... Il y a mieux comme algo de compression ;)


Message édité par matafan le 01-09-2007 à 12:00:44
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed