passer de 8 octetcs à 1 octet

passer de 8 octetcs à 1 octet - C - Programmation

Marsh Posté le 01-06-2006 à 22:28:57    

Bonsoir,
voilà j'ai un petit souci, j'aimerais passer de huits entier (1 ou 0); donc codés chacun sur 8bits; a un seul entier sur 8 bits!
 
par exemple j'ai une suite : 001000010011101010100  j'aimerais les regroupé comme ceci: 00100001 00111010 10100 (par paquet de 8 bits)
 
j'ai trouvé comment faire l'inverse ( partit d'un octet et lire bit par bit) mais je ne vois pas comment faire pour dans mon cas
 
voici ce que j'ai réussi a faire:
//fonction lecture de bit
int lecturebit(FILE*f)
{  
 int bit;
 static unsigned char octet;
 static int count=0;
 if(count == 0)
 {
  fscanf(f,"%c",&octet);
  count=8;
 }
 else{count=count-1;}
 bit=octet&1;
 octet=octet>>1;
 return bit;
}  
 
et voici ce que je pensais faire (mais ca ne marche pas):
// ici c'est un bout de fonction
// en gros je dois lire dans un fichier des char (variable: octet)
// si ce char est 1 on met comme bit 1 et si c'est 0 on met le bit 0 dans la variable donnee
// le but est d'avoir comme train binaire pour ma variable donnee, la suite des 8 0 ou 1 lu
fscanf(g,"%c",&octet);
      while( octet != 9);
           {if(count > 0)
                {
                 if(octet == 1)
                      {donnee&1=1;
                       donnee=donnee>>1;
                       
                      }
                 if(octet == 0)
                      {donnee&1=0;
                       donnee=donnee>>1;
                      }
                 count=count-1;
                }
            else{fprintf(g,"%d",donnee);
                 count=8;
                }
            fscanf(g,"%c",&octet);
           }
 
merci d'avance!!

Reply

Marsh Posté le 01-06-2006 à 22:28:57   

Reply

Marsh Posté le 01-06-2006 à 23:07:17    

pkoi la condition de ta boucle porte sur octe et non sur count?
je sais pas moi mais :

Code :
  1. BYTE count = 0;
  2. BYTE res = 0;
  3. char octet;
  4. while(count <9)
  5. {
  6.    fscanf(g,"%c",&octet);
  7.    if(octet == 1) //histoire de valider un rien ce qu'il y a dans le fichier
  8.        res+=(1<<count);// ca revient à ajouter 1 ou 2 ou 4 ou 8... bref met le bit de poids donné à 1
  9.    count++;
  10. }


pour l'affichage, de res, tu choisis !
 
bon je l'ai mis en BYTE, mais cest peut etre char, ca je sais pas!
 
@pluch

Reply

Marsh Posté le 01-06-2006 à 23:12:37    

oups...
bien sur :
- g est un FILE* et il a ete ouvert correctement et on le ferme une fois qu'on a fini.
- BYTE = unsigned char
 
et à ce sujet, mon VS2005 me bassine a propos de fscanf (entre autre) qui est deprecated (autrement dit plus d'actualité) et à remplacer par  
fscanf_s...cest une lubie M$ ou cest "universellement" acquis?
 
@pluche...moi vais o dodo

Reply

Marsh Posté le 01-06-2006 à 23:28:20    

pfuitt a écrit :

pkoi la condition de ta boucle porte sur octe et non sur count?


 
en fait la boucle porte sur octet car c'est ma condition d'arret!
en fait dans un fichier j'ai une suite de 0 et 1 se terminant par un 9 ( exemple 001011011011001011019)
 

Code :
  1. res=0;
  2. fscanf(g,"%c",&octet);
  3. while( octet != 9) // remarque dans mon précédent post j'avais mis un ; de trop ici
  4.     {
  5.      if(count < 9)
  6.             {
  7.              if(octet == 1)
  8.                 { res+=(1<<count);}
  9.              count++;
  10.             }
  11.      else{fprintf(z,"%c",res);
  12.             res=0;
  13.             count=0;
  14.            }
  15.     fscanf(g,"%c",&octet);
  16.    }


 
ok je pense que modifier comme ca pour mon cas ca devrai allé!
 
hum j'ai une boucle infini...  
merci pour l'aide

Reply

Marsh Posté le 02-06-2006 à 00:58:47    

ok ok !
bon maintenant je tente de faire l'inverse mais ca plante!:( je vous met la fonction complète et commentée

Code :
  1. void creation(histogramm h,int racine,char nom[100],char prenom[100])
  2. {FILE *f;
  3. FILE *g;
  4. char unsigned octet;
  5. int i,valeur,pos,bit;
  6. char donnee,blanc;
  7. int count=8;
  8. f=fopen(nom,"r" );//ouverture du fichier .comp
  9. for(i=0;i<256;i++)//on passe les 256 valeurs du tableau des frequences
  10.                         {fscanf(f,"%d",&valeur);
  11.                         fscanf(f,"%c",&blanc);//on passe le blancc entre deux nombres
  12.                         }
  13. /* ***************************** */
  14. /* en gros jusque ici il n'y a pas de blème! */
  15. /* j'indique au programme ou commencé a */
  16. /* réellement lire dans le fichier */
  17. printf("Quel nom pour le nouveau fichier ? (exemple: le meme sans .comp)\n" );
  18. scanf("%s",prenom);
  19. printf("\n" );
  20. g=fopen(prenom,"w" );
  21. fscanf(f,"%c",octet);// la ca coince! le programme s'arrète
  22. while(octet != 'x')//tant que je ne tombe pas sur le x marqueur de fin
  23.      {
  24.       pos=racine;
  25.       while(pos > 255)
  26.          {
  27.           if(count == 0)
  28.            {
  29.             count=8;
  30.             fscanf(f,"%c",octet);
  31.                }
  32.           else{
  33.                count=count-1;
  34.                bit=octet&1;
  35.                octet=octet>>1;
  36.                if(bit == 0)
  37.                   {pos=h[pos].enfant1;}
  38.                if(bit=1)
  39.                   {pos=h[pos].enfant2;}
  40.               }
  41.          }
  42.       donnee=(char)pos;
  43.       fprintf(g,"%c",donnee);
  44.       if(count == 0)// on ne reli un octet si on a fini avec le precedent
  45.           {fscanf(f,"%c",octet);}
  46.      }
  47. fclose(g);
  48.   fclose(f);
  49. }


 
voici le contenu du fichier "nom":
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 2 0 1 0 0 1 0 0 0 1 1 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 puis ici des "petit carrés" pour les octets ajouté moi meme puis "x" pour marquer la fin du fichier
 
donc le programme arrive bien au premier petit carré et là ca plante je ne sais pas quoi faire!
merci!


Message édité par Chyper le 02-06-2006 à 01:01:44
Reply

Marsh Posté le 02-06-2006 à 03:27:16    

Je pense qu'il faut regarder le fait que dans un octet tu travailles avec des puissances de 2 successives.
l'algorithme est pas très compliqué pour 1 octet mais un peu plus pour une quantité infinie de bits.
Le plus simple :
 
int buffer = 0;     // Buffer qui contient le bit final  
int[] tabEntier;    // Données que tu dois convertir (à initialiser)
 
// Pour les 8 premiers tableaux
for (int i=0; i<8; i++) {
 if (tabEntier[i] == 1) {
   // On ajoute le bit en puissance de 2
   buffer = buffer + pow2(i);  // Ajoute d'une puissance de 2 (voir Math.h)
 }
}

Message cité 1 fois
Message édité par aellihn le 02-06-2006 à 03:30:46
Reply

Marsh Posté le 02-06-2006 à 03:32:18    

Pour le fscanf, je me demande si ce n'est pas un &octet qu'il faut mettre...

Reply

Marsh Posté le 02-06-2006 à 16:12:53    

pfuitt a écrit :

...
et à ce sujet, mon VS2005 me bassine a propos de fscanf (entre autre) qui est deprecated (autrement dit plus d'actualité) et à remplacer par  
fscanf_s...cest une lubie M$ ou cest "universellement" acquis?
...


A ca sujet voir http://msdn2.microsoft.com/en-us/l [...] S.80).aspx pour plus de details.
 
A mon, avis ca doit etre "universellement" acquis ( http://std.dkuug.dk/jtc1/sc22/wg14/www/docs/n1031.pdf )
(mention de ISO/IEC inside)


Message édité par breizhbugs le 02-06-2006 à 16:14:05
Reply

Marsh Posté le 02-06-2006 à 18:45:40    

pfuitt a écrit :

et à ce sujet, mon VS2005 me bassine a propos de fscanf (entre autre) qui est deprecated (autrement dit plus d'actualité) et à remplacer par  
fscanf_s...cest une lubie M$


Oui. Mais à ma connaissance, tu peux désactiver ce warning. Ceci dit, je déconseille l'usage de fscanf()...  
 
http://mapage.noos.fr/emdel/notes.htm#saisie
http://mapage.noos.fr/emdel/notes.htm#fichiers


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 02-06-2006 à 18:47:32    

aellihn a écrit :

Je pense qu'il faut regarder le fait que dans un octet tu travailles avec des puissances de 2 successives.
   // On ajoute le bit en puissance de 2
   buffer = buffer + pow2(i);  // Ajoute d'une puissance de 2 (voir Math.h)


Au secours ! Apprendre à se servir des opérateurs bits avant de sortir l'artillerie !

>> << & | ~ ^


 
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 02-06-2006 à 18:47:32   

Reply

Marsh Posté le 02-06-2006 à 22:49:50    

Emmanuel Delahaye a écrit :

Oui. Mais à ma connaissance, tu peux désactiver ce warning. Ceci dit, je déconseille l'usage de fscanf()...  
 
http://mapage.noos.fr/emdel/notes.htm#saisie
http://mapage.noos.fr/emdel/notes.htm#fichiers


 donc en fait ce n'est pas une lubie M$... fscanf, sprintf et autre sont desormais deprecated et a bannir...à remplacer par leur equivalent "securisé"...
mici breizhbugs pour ton lien...rien ne vaut une bonne norme pou rmettre tout le monde d'accord.
 
@pluche

Reply

Marsh Posté le 02-06-2006 à 23:22:09    

pfuitt a écrit :

donc en fait ce n'est pas une lubie M$... fscanf, sprintf et autre sont desormais deprecated et a bannir...à remplacer par leur equivalent "securisé"...
mici breizhbugs pour ton lien...rien ne vaut une bonne norme pou rmettre tout le monde d'accord.


Attention, ce n'est pas la norme. C'est un TR, c'est à dire un Technical Report qui est une sorte de proposition d'évolution (AMA sous l'influence de Microsoft). Ne pas confondre avec les TC (Technical Corrigendum)  comme n1124 qui est une correction et une reprise complète de la norme C99.
 
Je rappelle que le WG sont des Working Groups.

Message cité 1 fois
Message édité par Emmanuel Delahaye le 02-06-2006 à 23:23:21

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 03-06-2006 à 09:42:43    

Emmanuel Delahaye a écrit :

Attention, ce n'est pas la norme. C'est un TR, c'est à dire un Technical Report qui est une sorte de proposition d'évolution (AMA sous l'influence de Microsoft). Ne pas confondre avec les TC (Technical Corrigendum)  comme n1124 qui est une correction et une reprise complète de la norme C99.
 
Je rappelle que le WG sont des Working Groups.


 
 
j'avais bien compris que ce n'etait pas un TC :)  et je n'evoquais que cette possibilité...
en tout cas, pour ma part même si MS influence ce genre de travaux je suis plutot pour... surtout dans le cas des focntion de formatage (genre sprintf) où il pouvait paraitre franchement aberrant que la taille max du tab. ne soit pas précisé...
 
enfin bref
 
@pluch

Reply

Marsh Posté le 03-06-2006 à 10:17:34    

Je viens de jetter un oeil à ces références de Microsoft, et bah ils ne remontent pas dans mon estime.
Dans le genre cryptique, on ne fait pas mieux.
En plus, j'ai jeté un rapide coup d'oeil, et leur strcpy_s semble être un équivalent de strncpy. Enfin il vaut mieux utiliser strlcpy/strlcat, développées par Theo de Raadt.


Message édité par simple_stupid le 03-06-2006 à 11:47:20
Reply

Marsh Posté le 03-06-2006 à 17:26:18    

heuu cryptique ???
critique ou crypté ?
:)

Reply

Sujets relatifs:

Leave a Replay

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