【问题标题】:Byte array to string gives "???" [closed]字节数组到字符串给出“???” [关闭]
【发布时间】:2011-09-18 05:26:24
【问题描述】:

所以我正在尝试用 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);
  }

但是这是我得到的字符串输出:

???????????

我做错了什么?

【问题讨论】:

  • @Alex,我看不出你发布的任何代码都可以编译...请清理一下。
  • @mre 我正在使用 System.out.println(message);
  • @Martijn 我使用 +1000 来避免写入文件的标题。否则它告诉我它无法读取文件。
  • 你是在操作图像文件的纯字节,还是解码后/编码前的图像数据?
  • @bemace 感谢您的关注。

标签: java string byte bytearray steganography


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 所以我使用的是我认为是无损的 BMP。如果我通过调用message.getBytes(); 将字符串转换为字节并使用新的String(messageBytes); 检索它不会都使用默认编码?
    • 你是对的,这不是这里的原因(如果不是所有的字符都在你的编码的可表示范围之外)。你还是应该定义编码而不是依赖默认编码。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-04
        相关资源
        最近更新 更多