Pergunta

Estou fazendo um projeto de esteganografia onde leio bytes de um arquivo ppm e adiciono o bit menos significativo a uma matriz.Assim, uma vez lidos 8 bytes, eu teria 8 bits em meu array, o que deveria ser igual a algum caractere em uma mensagem oculta.Existe uma maneira fácil de converter uma matriz de 0 e 1 em um valor ASCII?Por exemplo, a matriz: char bits[] = {0,1,1,1,0,1,0,0} seria igual a 't'. Simples C

Obrigado por todas as respostas.Vou dar uma chance a alguns desses.

Foi útil?

Solução

Um simples for Loop funcionaria - algo como


    unsigned char ascii = 0;
    unsigned char i;

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

Pode haver uma maneira mais rápida de fazer isso, mas isso é um começo, pelo menos.

Outras dicas

Eu não armazenaria os bits em uma matriz - eu ou eles com um char.

Então você começa com um valor de char 0: char bit = 0;

Quando você recebe o primeiro bit, ou com o que você tem: bit |= bit_just_read;

Continue fazendo isso a cada bit, mudando adequadamente; ou seja, depois de você conseguir a próxima parte, faça bit |= (next_bit << 1);. E assim por diante.

Depois de ler seus 8 bits, bit Será o valor ASCII apropriado e você pode imprimi -lo ou fazer o que quer com ele.

Eu concordo com Mipadi, não se preocupe em armazenar em uma matriz primeiro, isso é meio inútil. Como você precisa fazer um loop ou acompanhar o índice da matriz enquanto o lê, é melhor fazê -lo de uma só vez. Algo assim, talvez?

bits = 0;

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

Contanto que o bit endian esteja correto, isso deve funcionar e compilar bem pequeno.Se o bit endian estiver invertido, você poderá alterar o valor inicial da máscara para 1, a mudança da máscara para <<= e talvez seja necessário ter (0x0ff & máscara) como do{}while condicional se o seu compilador não faz o que deveria com variáveis ​​de tamanho de byte.Não se esqueça de fazer algo pelas funções mágicas que incluí onde eu não sabia o que você queria ou como você fazia alguma coisa

#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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top