2008-12-13 16 views
0

C'est bizarre. C'est un problème trivial:Problème C++ Stuffing 8 bits dans un char

Une chaîne std :: avec des bits avec une longueur multiple de 8, la première 8 est: "10011100".

//Convert each 8 bits of encoded string to bytes 
unsigned char c = 0; 
for(size_t i = 0; i < encoded.size(); i += 8) 
{ 
    for(size_t k = 0; k < 8; k++) 
    { 
     c <<= k; 
     if(encoded.at(i + k) == '1') c += 1; 

     //Debug for first 8 bits 
     if(i == 0) cout << "at k = " << k << ", c = " << (int)c << endl; 
    } 
    outFile.write(reinterpret_cast<char*>(&c), sizeof(char)); 
} 

donne la sortie:

at k = 0, c = 1 
at k = 1, c = 2 
at k = 2, c = 8 
at k = 3, c = 65 
at k = 4, c = 17 
at k = 5, c = 33 
at k = 6, c = 64 
at k = 7, c = 0 

Ce qui n'a pas de sens. Déplacer 2 places à gauche et obtenir 8 à partir de 2 est impossible. La valeur maximum qu'il peut avoir devrait être 111b = 7d et dans ce cas devrait être 100b = 4d.

Enlight moi.

Répondre

5
at k = 0, c = 1 
at k = 1, c = 2 
at k = 2, c = 8 

C'est parce que:

input = 10011100 
c = 0 

`k=0, b=1` shift by 0 add 1 => `c = 1`, dec = 1 
`k=1, b=0` shift by 1 add 0 => `c = 10`, dec = 2 
`k=2, b=0` shift by 2 add 0 => `c = 1000`, dec = 8 

b signifie "bit courant". Peut-être que vous ne voulez pas passer par k, mais par 1? Si vous cherchez une solution standard C++, vous pouvez utiliser std::bitset:

std::bitset<8> bits("10011100"); 
unsigned char c = bits.to_ulong(); 

Pour votre sortie dans le flux, vous pouvez utiliser la fonction put:

outFile.put(c); 

Il évite la coulée des pointeurs et des sorties également non formaté (les paramètres comme la largeur de champ sont ignorés).

Questions connexes