Pregunta

Estoy haciendo un proyecto esteganografía donde leí en bytes de un archivo ppm y añadir el bit menos significativo de una matriz. Así que una vez 8 bytes se leen, tendría 8 bits en mi matriz, que debe ser igual a un personaje en un mensaje oculto. ¿Hay una manera fácil de convertir una serie de 0 y 1. en un valor ASCII? Por ejemplo, la matriz: char bits[] = {0,1,1,1,0,1,0,0} sería igual a 't'. Plain C

Gracias por todas las respuestas. Voy a dar algunos de éstos un tiro.

¿Fue útil?

Solución

Un bucle for simple sería trabajar - algo así como


    unsigned char ascii = 0;
    unsigned char i;

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

Puede haber una manera más rápida de hacer esto, pero esto es un comienzo, al menos.

Otros consejos

No sería almacenar los bits en una matriz -. Me gustaría O con un char

Así que empiece con un valor de 0 Char: char bit = 0;

Al obtener el primer bit, o con lo que tiene: bit |= bit_just_read;

Sigue haciendo eso con cada bit, cambiando de forma adecuada; es decir, después de obtener el siguiente bit, hacer bit |= (next_bit << 1);. Y así sucesivamente.

Después de leer sus 8 bits, bit será el valor ASCII apropiada, y se puede imprimirlo o hacer lo que con ella se quiere hacer.

Estoy de acuerdo con mipadi, no se moleste almacenar en una matriz en primer lugar, que es una especie de sentido. Ya que tienes que bucle o de otro modo no perder de vista el índice de matriz al leer en ella, que también podría hacerlo de una sola vez. Algo como esto, tal vez?

bits = 0;

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

Mientras el endian bit es correcta, esto debería funcionar y compilar abajo bastante pequeña. Si el bit es endian hacia atrás, entonces debería ser capaz de cambiar el valor inicial de la máscara a 1, el cambio de máscara para << =, y puede que tenga que tener (0x0ff y máscara) como el do {} mientras condicional si su compilador no hace lo que se supone que las variables con bytes de tamaño. No se olvide de hacer algo por las funciones mágicas que incluí en el que no sabía lo que quería o cómo se hizo algo

#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++;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top