2010-03-26 6 views
4

Je fais un projet de stéganographie où je lis en octets à partir d'un fichier ppm et ajoute le bit le moins significatif à un tableau. Donc, une fois que 8 octets sont lus, j'aurais 8 bits dans mon tableau, ce qui devrait correspondre à un caractère dans un message caché. Y at-il un moyen facile de convertir un tableau de 0 et 1 en une valeur ASCII? Par exemple, le tableau: char bits[] = {0,1,1,1,0,1,0,0} équivaut à 't'. Plaine CUn moyen facile de convertir une chaîne de 0 et 1 dans un personnage? Plain C

Merci pour toutes les réponses. Je vais en donner quelques-uns.

+0

Voulez-vous dire vraiment '" 0,1,1,1,0 , 1,0,0 "'? Ou peut-être quelque chose de plus comme «{0,1,1,1,0,1,0,0}»? – Gabe

+0

Oui, je voulais dire des accolades: P – Anon

Répondre

4

Une boucle for simple, 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.

+0

y a-t-il quelque chose qui manque dans votre boucle for? – stefanB

+0

A dû corriger une mise en forme, mieux maintenant? –

+0

Ouais c'était une erreur, merci. bits contient '0' et '1', donc j'ai mis à jour la boucle. –

2

Je ne stockerais pas les bits dans un tableau - je les aurais avec un char.

Alors 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;

continuer à le faire avec chaque bit, décalage de façon appropriée; c'est-à-dire, après avoir obtenu le bit suivant, faites 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 ce que vous voulez faire.

+0

Ses bits sont dans l'autre ordre.Et vous devez changer votre puissance aussi, sinon, en supposant que next_bit est toujours défini, vous finissez toujours par 0x2 | bit_just_read –

+0

Je ne vois pas l'OP mentionner l'ordre dans lequel les bits sont, mais oui, l'algorithme que j'ai listé devrait être ajusté en fonction de la commande; et oui, chaque étape doit déplacer la valeur laissée par un autre bit. – mipadi

+0

Il a fait une pseudo affectation dans sa question. bit de bits [] = "0,1,1,1,0,1,0,0"; clairement la syntaxe est suspecte mais c'est correct pour 't', alors ... –

0

Je suis d'accord avec mipadi, ne vous embêtez pas à stocker dans un tableau en premier, c'est inutile. Puisque vous devez faire une boucle ou garder une trace de l'index du tableau en le lisant, vous pouvez tout aussi bien le faire en une 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; 
} 
0

Tant que le bit endian est correct, cela devrait fonctionner et compiler assez bas. Si le bit endian est en arrière alors vous devriez pouvoir changer la valeur initiale du masque à 1, le masque décalé à < < =, et vous pourriez devoir avoir (0x0ff & masque) comme le do {} conditionnel si votre Le compilateur ne fait pas ce qu'il est censé faire avec des variables de taille octet. 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++; 
} 
Questions connexes