2016-02-17 2 views
0

Je le morceau de code suivant pour convertir ASCII sixbit à une chaîne ASCII:bitset <4> converti en valeur erronée sur Win7 Embarqué

std::string SixBitToASCII(char *buffer) 
    { 
     std::stringstream ss; 
     std::stringstream out; 

     for (int index = 0; index < 16; index++) 
     { 
      std::bitset<4> bset(buffer[index]); 

      std::cout << buffer[index] << " - " << bset << std::endl; 

      ss << bset; 
     } 

     std::cout << ss.str() << std::endl; 

     for (int index = 0; index < 60; index += 6) 
     { 
      std::string s = ss.str().substr(index, index + 6); 
      std::bitset<6> bits; 
      std::istringstream is(s); 
      is >> bits; 

      int asciiCode = bits.to_ulong() + 32; 

      out << (char) asciiCode; 
     } 

     return out.str(); 
    } 

Il compile bien. Je compile dans un VS2012 Win7 Professional 32 bits.

Quand je lance dans un Win7 je suis embarqué obtenir la sortie suivante:

8 - 1000 
f - 0110 <<< ??? PROBLEM HERE 
2 - 0010 
9 - 1001 
2 - 0010 
3 - 0011 
4 - 0100 
1 - 0001 
0 - 0000 
4 - 0100 
1 - 0001 
3 - 0011 

100001100010100100100011010000010000010000010011 

Qu'est-ce qui se passe où est maked comme un problème? Conversion F à 0100 ??? Isn't est censé être 1111?

Bien sûr, la conversion finale est incorrecte en raison de cette erreur convergente F. J'ai essayé std::bitset<4> bset((unsigned char) buffer[index]) avec les mêmes résultats.

Aide appréciée.

+0

N'utilisez pas 'std :: endl' à moins que vous n'ayez besoin des choses supplémentaires. ''n''arrête une ligne. –

+0

Vous ne savez pas exactement ce que vous entendez par "Conversion de F à 0100"? Voulez-vous dire "Convertir f en 0110"? Ce qui est correct pour ASCII comme le souligne Pete. Le code ASCII pour 'f' est 01100110. Peut-être que vous mélangez avec le chiffre hexadécimal F. –

+0

Cela aiderait votre question si vous montriez ce qui était dans 'buffer' et montriez aussi ce que vous attendiez et quel encodage à six bits vous utilisiez. Les exemples sur Wikipedia n'incluent aucune lettre minuscule parmi les 64 caractères. –

Répondre

1

Pour mieux voir ce qui se passe, changer

std::cout << buffer[index] << " - " << bset << std::endl; 

à

std::cout << +buffer[index] << " - " << bset << std::endl; 

qui vous montrera la valeur numérique de buffer[index] au lieu de quelque nature qu'elles soient que la valeur numérique représente. Je ne sais pas à quoi se réfère le "Sixbit ASCII", mais avec un ASCII rectiligne, le résultat que vous voyez est exactement ce à quoi je m'attendais: le code ASCII pour la lettre f est 0x66, donc les 4 bits bas sont, 0110. Vous devez convertir ces codes de caractères en chiffres. De nouveau pour ASCII (et pour tous les codes de caractères standard), les valeurs comprises entre '0' et '9' peuvent être converties en soustrayant '0'; Les valeurs comprises entre 'a' et 'f' et 'A' à 'F' nécessiteront une recherche plus sophistiquée.

+0

[link] https://en.wikipedia.org/wiki/Six-bit_character_code pour SixBit. Les caractères sont des valeurs hexadécimales à 1 octet. BTW: Que fait le '+'. Maintenant, je vois toutes les valeurs décimales (dans ce cas 102 pour f) ... humm. J'ai besoin de convertir la valeur hexadécimale du texte en valeur hexadécimale numérique ... – Mendes

+0

@Mendes - cet article Wikipédia liste un tas de variantes. Quoi qu'il en soit, cet inséreur de flux affiche la valeur de caractère que chaque entrée représente; pour comprendre ce qui se passe, vous devez regarder la valeur numérique. –

+0

Pete, ça m'a aidé. J'ai besoin d'un convertisseur ASCII Literal to Integer ... Problème pour un nouveau sujet ... Merci. – Mendes