Einfache Möglichkeit, eine Reihe von 0 und 1 ist in ein Zeichen zu konvertieren? Plain C

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

  •  22-09-2019
  •  | 
  •  

Frage

Ich bin ein Steganographie-Projekt zu tun, wo ich in Bytes aus einer ppm-Datei lesen und das niedrigstwertige Bit zu einem Array hinzuzufügen. Also einmal 8 Bytes eingelesen werden, würde ich habe 8 Bits in meinem Array, das einige Zeichen in einer versteckten Nachricht sollte gleich. Gibt es eine einfache Möglichkeit, eine Reihe von 0 und 1 ist in einen ASCII-Wert zu konvertieren? Zum Beispiel kann das Array: würde char bits[] = {0,1,1,1,0,1,0,0} ‚t‘ gleich. Plain C

Danke für alle Antworten. Ich werde einige dieser einen Schuss geben.

War es hilfreich?

Lösung

Eine einfache for Schleife funktionieren würde - so etwas wie


    unsigned char ascii = 0;
    unsigned char i;

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

Es könnte ein schnellerer Weg, dies zu tun, aber das ist ein Anfang zumindest.

Andere Tipps

Ich würde die Bits in einem Array nicht speichern -. Ich würde oder mit einem char

So können Sie mit einem char-Wert von 0 beginnen: char bit = 0;

Wenn Sie das erste Bit zu bekommen, oder es mit dem, was Sie haben: bit |= bit_just_read;

Halten Sie mit jedem Bit zu tun, dass Verschiebung in geeigneter Weise; das heißt, nachdem Sie das nächste Bit zu erhalten, tun bit |= (next_bit << 1);. Und so weiter.

Nachdem Sie Ihre 8 Bits lesen, bit wird der entsprechende ASCII-Wert sein, und Sie können es ausdrucken oder tun, was damit Sie tun möchten.

Ich bin mit mipadi, nicht der Mühe zuerst in einem Array zu speichern, die irgendwie sinnlos ist. Da Sie eine Schleife haben oder sonst Spur des Array-Index zu halten, während es beim Lesen, könnte man genauso gut tun, es in einem Rutsch. So etwas wie dies vielleicht?

bits = 0;

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

Solange das Bit Endian korrekt ist, sollte dies ziemlich klein arbeiten und kompilieren nach unten. Wenn der Bit-Endian ist nach hinten, dann sollten Sie in der Lage sein, den Anfangswert der Maske auf 1 zu ändern, um die Maske Verschiebung << =, und Sie vielleicht haben müssen (0x0FF & mask) als do {} while Bedingung, wenn Ihr Compiler nicht tut, was es mit Byte großen Variablen angenommen hat. Vergessen Sie nicht, etwas für die magischen Funktionen zu tun, dass ich eingeschlossen, wo ich nicht wusste, was sie wollte, oder wie Sie tat etwas

#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++;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top