2011-06-19 97 views
0

所以我想在java中編寫一個steganography程序。字節數組到字符串給出「???」

這裏是我迄今爲止(重要部件)

private void hideMessage(){ 
    byte[] messageBytes = message.getBytes(); 
    //message is a string 
    int messageLength = messageBytes.length; 
    for(int i = messageLength-1; i>=0; i--){ 
     imageBytes[i+100000] = messageBytes[i]; 
     //imageBytes is a bitmap image read into a byte array using imageIO 
    } 
    } 

private void getMessage(){ 
    int messageLength = 11; 
    byte[] messageBytes = new byte[messageLength]; 
    for(int i = messageLength; i>0; i--){ 
     messageBytes[i-1] = imageBytes[i+10000]; 
    } 
    message = new String(messageBytes); 
    } 

然而,這是輸出我得到的字符串:

??????????? 

什麼我做錯了嗎?

+0

爲什麼'+ 10000'? –

+0

@Alex,我沒有看到你發佈的任何代碼是如何編譯的......請清理它。 – mre

+0

@mre我打印出來使用System.out.println(消息); – Alex

回答

1

注意你的零點。您的評論說,1000,getMessage使用10000,和hideMessage使用100000

1

你不能簡單地從任意字節創建一個字符串 - 字節必須是你使用的編碼中的字符編碼(在你的情況下,默認編碼)。如果使用不映射到字符的字節,則它們將映射到'?'。在另一個方向上也是如此:如果您有一個字符串不包含映射到字節的字符,則getBytes()方法會將它們映射到(byte)'?'。我認爲這是發生在這裏的一種或兩種情況。

如果您使用的是JPG或類似的有損圖像格式,它將在保存期間更改圖像的字節。

+0

所以我使用BMP,我認爲它是無損的。如果我通過調用'message.getBytes();'將字符串轉換爲字節並使用新的'String(messageBytes)檢索它;'都不會使用默認編碼? – Alex

+0

你說得對,這裏不是原因(如果不是所有的字符都在你編碼的可表示範圍之外)。你最好還是應該定義編碼,而不是依靠默認編碼。 –

1

如果計劃實際上更改了部分位圖字節,則需要將圖像導出爲png,因爲它的無損。 Jpeg可能會稍微改變這些字節,這對圖像來說不是問題,但對於文本來說它顯然是至關重要的。其次,如果您要挑選100,000個作爲插入消息的固定位置,則應該將其設置爲常量以使其更容易,並且不易出錯。說到這一點,您當前的固定偏移量會以「0」,「10,000」和「100,000」關閉。

0

但是你要編輯原始文件,但BufferedImage實例(因爲顯然這一切都錯了轉載的答案),然後把它改寫回到ImageIO的文件。