Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2703 connectés 

  FORUM HardWare.fr
  Programmation
  C

  probleme Compression d'entier, de texte

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

probleme Compression d'entier, de texte

n°1606423
k3nsou
Posté le 30-08-2007 à 17:00:53  profilanswer
 

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  

mood
Publicité
Posté le 30-08-2007 à 17:00:53  profilanswer
 

n°1606499
Sve@r
Posté le 30-08-2007 à 18:43:17  profilanswer
 

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.
n°1606605
k3nsou
Posté le 31-08-2007 à 00:59:33  profilanswer
 

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^! ^^
 
 

n°1606754
matafan
Posté le 31-08-2007 à 13:24:35  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  probleme Compression d'entier, de texte

 

Sujets relatifs
Problème avec les sockets !Intégration de fichier texte dans Access en VBA
Probleme depuis l'installation de visual c++Problème sur mon site internet.
Problème de débutant :p.sqlplus: pb format colonne dans un fichier texte issu d'une requête
[VBS] Problème sur RUNProbleme script d'ajout d'entrée dans une base mysql
Problème d'opération avec letProbleme COOKIE site multi langue[RESOLU]
Plus de sujets relatifs à : probleme Compression d'entier, de texte


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR