字节数组到字符串给出“???”

时间:2011-06-19 16:53:26

标签: java string byte bytearray steganography

所以我想在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);
  }

然而,这是我得到的字符串输出:

???????????

我做错了什么?

4 个答案:

答案 0 :(得分:1)

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

如果您使用JPG或类似的有损图像格式,它将在保存期间更改图像的字节。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

(因为显然这一切都是错误的,所以重新作为回答)

答案 3 :(得分:0)

但是你应该编辑原始文件,但是BufferedImage的实例,然后将其重写回ImageIO的文件。