Domanda

che sto facendo un progetto di steganografia dove ho letto in byte da un file ppm e aggiungi il bit meno significativo a un array. Quindi, una volta 8 byte vengono letti, avrei 8 bit nella mia serie, che deve essere uguale a qualche personaggio in un messaggio nascosto. C'è un modo semplice per convertire una serie di 0 e 1 di in un valore ASCII? Ad esempio, l'array: char bits[] = {0,1,1,1,0,1,0,0} sarebbe uguale 't'. Plain C

Grazie per tutte le risposte. Sto andando dare alcuni di questi un colpo.

È stato utile?

Soluzione

Un semplice ciclo for avrebbe funzionato - qualcosa come


    unsigned char ascii = 0;
    unsigned char i;

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

Ci potrebbe essere un modo più veloce per fare questo, ma questo è un inizio, almeno.

Altri suggerimenti

Non vorrei memorizzare i bit in un array - mi piacerebbe o con un carattere

.

Quindi, si inizia con un valore char di 0: char bit = 0;

Quando si ottiene il primo bit, o con quello che hai: bit |= bit_just_read;

Continuare a fare che, con ogni bit, spostando in modo appropriato; vale a dire, dopo aver ottenuto il bit successivo, fare bit |= (next_bit << 1);. E così via.

Dopo aver letto i vostri 8 bit, bit sarà il valore ASCII appropriata, ed è possibile stamparlo o fare quello con essa si vuole fare.

Sono d'accordo con mipadi, non si preoccupano di memorizzare in un array prima, che una specie di inutile. Dal momento che avete a ciclo o comunque tenere traccia della indice di matrice durante la lettura in, si potrebbe anche farlo in una volta sola. Qualcosa di simile, forse?

bits = 0;

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

Fino a quando l'endian bit è corretto, questo dovrebbe funzionare e compilare giù abbastanza piccola. Se il bit è endian indietro allora si dovrebbe essere in grado di cambiare il valore iniziale della maschera a 1, lo spostamento maschera per << =, e potrebbe essere necessario avere (0x0ff & maschera) come il do {} mentre condizionale se il compilatore non fa quello che si suppone con le variabili di dimensioni byte. Non dimenticate di fare qualcosa per le funzioni magiche che ho incluso in cui non sapevo quello che volevi o come hai fatto qualcosa

#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++;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top