Une façon simple de convertir une chaîne de 0 et de 1 dans un personnage? plaine C

StackOverflow https://stackoverflow.com/questions/2521237

  •  22-09-2019
  •  | 
  •  

Question

Je fais un projet de stéganographie où je l'ai lu en octets à partir d'un fichier ppm et ajouter le bit de poids à un tableau. Donc, une fois 8 octets sont lus, j'aurais 8 bits dans mon tableau, qui doit être égal à un certain caractère dans un message caché. Est-il un moyen facile de convertir un tableau de 0 et de 1 dans une valeur ascii? Par exemple, le tableau: char bits[] = {0,1,1,1,0,1,0,0} serait égal « t ». Plaine C

Merci pour toutes les réponses. Je vais donner certains d'entre eux un coup de feu.

Était-ce utile?

La solution

Une simple boucle de for fonctionnerait - quelque chose comme


    unsigned char ascii = 0;
    unsigned char i;

    for(i = 0; i < 8; i++)
       ascii |= (bits[7 - i] << i);

Il pourrait y avoir un moyen plus rapide pour ce faire, mais cela est un début au moins.

Autres conseils

Je ne stocker les bits dans un tableau - je les avais OU par un caractère

.

Vous commencez avec une valeur char de 0: char bit = 0;

Lorsque vous obtenez le premier bit, ou avec ce que vous avez: bit |= bit_just_read;

Continuez à faire que chaque bit, décalage de manière appropriée; à savoir, une fois que vous obtenez le bit suivant, faire bit |= (next_bit << 1);. Et ainsi de suite.

Après avoir lu vos 8 bits, bit sera la valeur ASCII appropriée, et vous pouvez l'imprimer ou faire tout avec elle que vous voulez faire.

Je suis d'accord avec mipadi, ne vous embêtez pas stocker dans un tableau d'abord, c'est un peu inutile. Puisque vous devez boucle ou autrement garder une trace de l'index du tableau en le lisant, vous pourriez aussi bien le faire en une seule fois. Quelque chose comme ça, peut-être?

bits = 0;

for ( i = 0; i < 8; ++i ) {
    lsb = get_byte_from_ppm_somehow() & 0x01;
    bits <<= 1 | lsb;
}

Tant que le bit endian est correct, cela devrait fonctionner et compiler vers le bas assez petit. Si le endian bit est en arrière alors vous devriez être en mesure de changer la valeur initiale du masque à 1, le changement de masque << =, et vous pourriez avoir besoin d'avoir (0x0ff et masque) comme do {} while conditionnelle si votre compilateur ne fait pas ce qu'il est censé byte les variables de taille. Ne pas oublier de faire quelque chose pour les fonctions magiques que j'inclus où je ne savais pas ce que vous vouliez ou comment vous avez fait quelque chose

#include <stdint.h> // needed for uint8_t
...
uint8_t acc, lsb, mask;
uint8_t buf[SOME_SIZE];
size_t len = 0;

while (is_there_more_ppm_data()) {
    acc = 0;
    mask = 0x80; // This is the high bit
    do {
         if (!is_there_more() ) {
             // I don't know what you think should happen if you run out  on a non-byte boundary
             EARLY_END_OF_DATA();
             break;
         }
         lsb = 1 & get_next_ppm_byte();
         acc |= lsb ? mask : 0; // You could use an if statement
         mask >>= 1;
    } while (mask);
    buf[len] = acc; // NOTE: I didn't worry about the running off the end of the buff, but you should. 
    len++;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top