2012-04-11 10 views
3

我對C和按位操作都比較陌生,而且我在課堂上給予的作業有麻煩。大部分代碼已經發給我了,但我一直在解決與按位操作有關的部分問題。一旦我弄清楚了這一部分,我就會變得金黃。我希望有人能幫助!隱寫術程序中的按位操作(C)

這裏是我的任務摘錄:

您將需要使用8個字節的圖像來隱藏一個字節的信息(請記住,只有封面圖像的最低有效位可以被修改)。您將使用封面圖像的16個字節的其餘部分嵌入16位b.size(二進制數據的大小字段的兩個最低有效字節),封面的下32個字節將用於嵌入文件擴展名 爲有效載荷文件,然後您將使用8 * b.size字節來嵌入有效載荷(b.data)。

這是什麼程序做的是圖像的速記,我不得不修改使用來自我創建了一個文件中讀取數據圖像的最小顯著位。就像我說的那樣,所有的代碼都已經寫好了。我只是無法弄清楚如何修改LSB。任何幫助將不勝感激!!!

我必須使用重新格式化的最低有效位的功能如下:

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

這是我迄今爲止嘗試:

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

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

我老老實實在一個完全喪失。我一整晚都在爲此工作,而且我還沒有取得進展。

+0

BTW:[速記](http://en.wikipedia.org/wiki/Stenography)// [隱寫術(http://en.wikipedia.org/wiki/Steganography) - 請更正您的發帖 – Mat 2012-04-11 12:24:28

+0

我道歉;我並不是想讓它看起來像我試圖爲我完成它。我所嘗試過的所有東西都失敗了,因爲我似乎無法理解按位運算。在大學生涯中,我從來沒有必須和他們打交道。 – JamesClem 2012-04-11 12:29:52

+0

然後發佈您嘗試的代碼,以便人們可以解釋您做錯了什麼。 – Mat 2012-04-11 12:32:58

回答

4

要設置LSB b鍵1:

b |= 1; 

要設置LSB B至0的:

b &= 0xFE; 

這裏有一個想法的功能如何實現。此代碼未經測試。

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。雖然我希望OP提到他允許玩的LSB有多少(我不認爲它只有1個,因爲他使用了'bits'這個詞)。 – ArjunShankar 2012-04-11 12:49:20

+0

我很抱歉我沒有關注這篇文章;最近我一直忙於其他課程,沒有太多時間專注於此課程。我apprecaite的幫助!我會嘗試一下,讓你知道這是否解決了我的問題。我相信我現在開始更好地理解按位操作。另外,對於上面的海報,我不得不操縱多個字節,但我允許在主函數中使用循環結構來處理這個問題。從外觀來看,這可能解決我一直在獲取和設置LSB時遇到的問題。 – JamesClem 2012-04-24 05:10:47

+0

您爲getlsbs創建的解決方案似乎完美運行,但不幸的是,設置它們似乎沒有正常工作。不過,我非常感謝你讓我走得這麼遠。我之前很困難。我會和他們一起玩,看看我能否讓他們正常工作 – JamesClem 2012-05-01 06:55:01