2012-04-11 9 views
3

Ich bin relativ neu in C und bitweise Operationen und ich habe Probleme mit einer Aufgabe, die ich in meiner Klasse erhalten habe. Ein Großteil des Codes wurde mir gegeben, aber ich hatte Probleme, einen Teil herauszufinden, der bitweise Operationen betrifft. Sobald ich diesen Teil herausgefunden habe, werde ich golden sein. Ich hoffe, dass jemand helfen kann! HierBitweise Operationen in einem Steganographie-Programm (C)

ist der Auszug aus meiner Aufgabe:

Sie müssen 8 Bytes eines Bildes verwenden ein Byte an Informationen zu verbergen (denken Sie daran, dass nur LSBs der Abdeckung Bild kann geändert werden). Sie verwenden den Rest der 16 Bytes des Deckungsbildes, um 16 Bits von b.size (zwei niederwertigste Bytes des Größenfeldes für die binären Daten) einzubetten, die nächsten 32 Bytes des Deckels werden verwendet, um die Dateierweiterung einzubetten für die Nutzlastdatei, und danach werden Sie 8 * b.size Bytes verwenden, um die Nutzlast (b.data) einzubetten.

Was dieses Programm tut, ist Stenographie eines Bildes, und ich habe die am wenigsten signifikanten Bits des Bildes in unter Verwendung von Daten aus einer Datei lesen ändern, die ich erstellt. Wie ich schon sagte, der gesamte Code dafür ist bereits geschrieben. Ich kann einfach nicht herausfinden, wie man die LSBs ändert. Jede Hilfe würde sehr geschätzt werden !!!

Die Funktionen Ich habe für eine Neuformatierung der LSBs zu verwenden sind wie folgt:

byte getlsbs(byte *b); 
void setlsbs(byte *b, byte b0); 

Dies ist, was ich bisher versucht habe:

/* In main function */ 
b0 = getlsbs(&img.gray[0]) 

/* Passing arguments */ 
byte getlsbs(byte *b) 
{ 
    byte b0; 
    b0[0] = b >> 8; 
    return b0; 
} 

Ich bin ehrlich zu einem vollständigen Verlust

. Ich habe die ganze Nacht daran gearbeitet und bin immer noch kaum vorangekommen.

+0

BTW: [Stenographie] (http://en.wikipedia.org/wiki/Stenography) // [Steganographie] (http://en.wikipedia.org/wiki/Steganography) - bitte korrigieren Sie Ihre post – Mat

+0

Ich entschuldige mich; Ich wollte es nicht so aussehen lassen, als hätte ich versucht, es für mich zu tun. Alles, was ich versucht habe, ist kläglich gescheitert, weil ich bitweise Operationen einfach nicht verstehen kann. Ich musste mich nie zuvor in meiner College-Karriere mit ihnen auseinandersetzen. – JamesClem

+0

Dann poste den Code, den du versucht hast, damit die Leute erklären können, was du falsch machst. – Mat

Antwort

4

einzustellen LSB von b bis 1:

b |= 1; 

einzustellen LSB von b 0:

b &= 0xFE; 

Hier ist eine Idee, wie die Funktionen umgesetzt werden könnten. Dieser Code wurde nicht getestet.

byte getlsbs(byte *b) 
{ 
    byte result = 0; 
    for (int i = 0; i < 8; ++i) 
    { 
     result >>= 1; 
     if (*b & 1) 
      result |= 0x80; 
     ++b; 
    } 
    return result; 
} 

void setlsbs(byte *b, byte b0) 
{ 
    for (int i = 0; i < 8; ++i) 
    { 
     if (b0 & 1) 
      *b |= 1; 
     else 
      *b &= 0xFE; 
     ++b; 
     b0 >>= 1; 
    } 
} 
+0

+1. Obwohl ich wünschte, OP hätte erwähnt, wie viele der LSBs er spielen darf (ich glaube nicht, dass es nur 1 ist, weil er das Wort "Bits" benutzt hat). – ArjunShankar

+0

Ich entschuldige mich, dass ich diesen Beitrag nicht beachtet habe; Ich war in letzter Zeit ziemlich beschäftigt mit anderen Klassen und hatte nicht viel Zeit, mich auf dieses Programm zu konzentrieren. Ich apprecaite die Hilfe! Ich werde es ausprobieren und Sie wissen lassen, ob das mein Problem behebt. Ich glaube, ich beginne nun, Bit-Operationen besser zu verstehen. Auch auf dem Poster über mir muss ich mehrere Bytes manipulieren, aber ich bin erlaubt, eine Schleifenstruktur zu verwenden, um dies in der Hauptfunktion zu handhaben. Wie es aussieht, könnte dies das Problem lösen, das ich beim Abrufen und Einstellen meiner LSBs hatte. – JamesClem

+0

Die Lösungen, die Sie für getlsbs erstellt haben, scheinen perfekt zu funktionieren, aber die Einstellung scheint nicht richtig zu funktionieren. Ich danke Ihnen sehr dafür, dass Sie mich so weit gebracht haben. Ich war vorher so festgefahren. Ich werde mit ihnen herumspielen und schauen, ob ich sie richtig arbeiten lassen kann – JamesClem