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

您不能简单地从任意字节创建字符串 - 字节必须是您正在使用的编码中的字符编码(在您的情况下为默认编码)。如果您使用不映射到字符的字节,它们将被映射到'?'. 在另一个方向上也是如此:如果您有一个包含不映射到字节的字符的字符串,该getBytes()方法会将它们映射到(byte)'?'. 我认为这其中之一或两者都发生在这里。

如果您使用 JPG 或类似的有损图像格式,它会在保存过程中更改图像的字节数。

于 2011-06-19T17:07:22.137 回答
1

如果计划是实际更改位图字节的一部分,则需要将图像导出为 png,因为它是无损的。Jpeg 可能会稍微改变字节,这对于图像来说不是问题,但对于文本来说显然很关键。

其次,如果您要选择 100,000 作为插入消息的固定位置,则应将其设置为常数,以使其更容易且不易出错。说到这一点,您当前的固定偏移量相差了“0”、10,000 和 100,000。

于 2011-06-19T17:18:51.577 回答
1

注意你的零。您的评论说 1000,getMessage使用 10000,并hideMessage使用 100000

(重新发布为答案,因为显然这都是错误的)

于 2011-06-19T18:00:14.577 回答
0

但是您应该编辑原始文件,而是 的实例BufferedImage,然后将其重写回具有ImageIO.

于 2011-06-19T18:33:14.780 回答