0

だから私はJavaでステガノグラフィプログラムを書こうとしています。

これが私がこれまでに持っているものです(重要な部分)

  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);
  }

ただし、これは文字列に対して取得する出力です。

???????????

私は何を間違っていますか?

4

4 に答える 4

1

ゼロに注意してください。あなたのコメントは 1000 と言い、getMessage10000 をhideMessage使用し、100000を使用します

(明らかにそれだけが間違っていたので、回答として再投稿しました)

于 2011-06-19T18:00:14.577 に答える
1

任意のバイトから単純に文字列を作成することはできません。バイトは、使用しているエンコーディング (この場合はデフォルトのエンコーディング) の文字のエンコーディングでなければなりません。文字にマップされないバイトを使用すると、それらは にマップされ'?'ます。同じことが他の方向にも当てはまります。バイトにマップされない文字を含む文字列がある場合、getBytes()メソッドはそれらを にマップします(byte)'?'。このどちらかまたは両方がここで起こったと思います。

JPG または同様の非可逆画像形式を使用している場合、保存中に画像のバイト数が変更されます。

于 2011-06-19T17:07:22.137 に答える
1

実際にビットマップ バイトの一部を変更する計画がある場合は、画像をロスレスとして png としてエクスポートする必要があります。Jpeg はおそらくバイトをわずかに変更しますが、これは画像にとっては問題ではありませんが、テキストにとっては明らかに重要です。

第 2 に、メッセージを挿入する固定位置として 100,000 を選択する場合は、それを定数として設定することで、挿入が容易になり、エラーが発生しにくくなります。そういえば、現在の固定オフセットは「0」、10,000、100,000 ずれています。

于 2011-06-19T17:18:51.577 に答える
0

ただし、rawファイルを編集する必要がありますが、のインスタンスを編集しBufferedImageてから、を含むファイルに書き直してImageIOください。

于 2011-06-19T18:33:14.780 に答える