Conversion string (binaire) to string (hexa)

Signaler
Messages postés
8
Date d'inscription
jeudi 13 mars 2003
Statut
Membre
Dernière intervention
30 août 2006
-
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
-
Bonjour, voila je susi toujours dans mon big programme, j'ai un petit problème sur une conversion d'un string (de mot binaire) en conversion de string (de mot hexa). voila ce que j'ai effectué :
//Le message exemple est : "10001101001010011" je voudrais le résultat  suivant : "1 1A52"

std::string bin_Hexa(std::string & chaine)

    int longueur = chaine.size();  // longueur en nb de caractere de la chaine entree    int i 0, j 0,separateur = 0; 
    int bits = 3;  // nombre d'octets dans un bit (de 0 à 7)
    int reste;  // reste de bits
    string chainetemp, chainelongue; // chaine destination en binaire


 reste = longueur%4;      //calcul le nombre de bits 
 i = longueur;
 while(i>0)
 {
     if(i>=3)      //si le nombre de bits restant est supérieur a trois on releve la chaine
     {               // pb ici la chaine ne contient pas
         chainetemp = chaine[i-3]+chaine[i-2]+chaine[i-1]+chaine[i];
         i= i-4;
      }
     else
     {
         chainetemp = "";            
         for(j=0;j<(bits+1-reste);j++)
         { 
             chainetemp += "0";      //rajoute des 0 pour les derniers octets dans notre cas pour le 1 qui est seul
         }
         for(j=0;j<reste;j++)
         { 
          chainetemp += chaine[reste-j];
          i--;
      }


  }
  
  switch (chainetemp)      //erreur dans le switch lors d'un passage de string
  {
   case "0000": chainelongue = "0"+ chainelongue; break;// 'valeur hexa '0'
   case "0001": chainelongue = "1"+ chainelongue;// 'valeur hexa '1'
   case "0010": chainelongue = "2"+ chainelongue;// 'valeur hexa '2'
   case "0011": chainelongue = "3"+ chainelongue;// 'valeur hexa '3'
   case "0100": chainelongue = "4"+ chainelongue;// 'valeur hexa '4'
   case "0101": chainelongue = "5"+ chainelongue;// 'valeur hexa '5'
   case "0110": chainelongue = "6"+ chainelongue;// 'valeur hexa '6'
   case "0111": chainelongue = "7"+ chainelongue;// 'valeur hexa '7'
   case "1000": chainelongue = "8"+ chainelongue;// 'valeur hexa '8'
   case "1001": chainelongue = "9"+ chainelongue;// 'valeur hexa '9'
   case "1010": chainelongue = "A"+ chainelongue;// 'valeur hexa 'a ou A'
   case "1011": chainelongue = "B"+ chainelongue;// 'valeur hexa 'b ou B'
   case "1100": chainelongue = "C"+ chainelongue;// 'valeur hexa 'c ou C'
   case "1101": chainelongue = "D"+ chainelongue;// 'valeur hexa 'd ou D'
   case "1110": chainelongue = "E"+ chainelongue;// 'valeur hexa 'e ou E'
   case "1111": chainelongue = "F"+ chainelongue;// 'valeur hexa 'f ou F'
   default:  std::cout<<"ERREUR DE SAISIE"<<std::endl; return 0;
  }
  if(separateur >= 3)
  {   chainelongue " "+ chainelongue;      //rajoute un séparateur tout les 4 octets (car beaucoup de chiffres> plus lisible 
   separateur=0;
  }
  else
  {
   separateur++;
  }
 
 } // fin de for - passage au quatre caracteres suivants de la chaine d'origine jusqu'a fin de chaine
 chainelongue+='\0'; // fermeture de la chaine de caractère génerée


 return chainelongue;
}
Merci beaucoup (plus spécialement à luthor qui m'a deja bcp aidé  )

1 réponse

Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
Salut;
Déjà tu devrais compléter la chaîne directement avec des 0 au lieu de tester à chaque fois, par ex. :

while(chaine.size()%4!=0) chaine="0"+chaine;

Puis ensuite :

int size=chaine.size();

for(int i=0;i<size;i+=4)
{
   string Str=chaine[i+3]+chaine[i+2]+chaine[i+1]+chaine[i];
   if(Str=="0000") chainelongue="0"+chainelongue;
   if(Str=="0001") chainelongue="1"+chainelongue;
   // ...
}

ça devrait aller (enfin j'espère)...