如何反转此代码以解码来自顶行的消息

时间:2016-06-30 11:43:16

标签: java ascii bmp

我需要解码来自BMP图片中顶部像素的消息。二进制中的红色值中隐藏有一条消息。我试图找到一种方法来做到这一点并没有成功,因为大多数程序使用.jpg或.png文件类型的图像和BMP图像不能在该代码中工作。我需要找出如何反转此代码以使用数组解码消息,我需要以ASCII文本打印消息。对于某些程序,他们允许我排列图像的顶行,但我不知道如何打印它。以下是在图像中对消息进行编码的代码:

import java.awt.*;
class Encode
{
    public void encodeMessage(Picture image, int [] binaryArray)
    {
        Pixel pixelTarget = new Pixel(image,0,0);
        Pixel [] pixelArray = image.getPixels();
        Color pixelColor = null;
        int redValue = 0;

        for(int x = 0; x < binaryArray.length; x++)
        {
            redValue = binaryArray[x];
            pixelTarget = pixelArray[x];
            pixelTarget.setRed(redValue);
        }
        pixelTarget = pixelArray[binaryArray.length];
        pixelTarget.setRed(255);

        image.write("SecretMessage.bmp");
        image.explore();
    }
}
public class EncodeTester
{ 
    public static void main(String[] args)
    {
        int[] bitArray = {0,1,1,0,0,0,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,1,1,0,0,1,1,0,0,0,0,1,0,1,1,1,0,0,1,0,0,1,1,1,1,0,0,1};    
        Picture image = new Picture("earth.bmp");
        Encode message = new Encode();

        message.encodeMessage(image, bitArray);

    }
}

有人可以解释如何继续或编写示例代码供我阅读bmp文件,从数组中获取红色值并以ASCII文本打印出来。感谢

编辑:这不完全是steganograhpy。它是不同的,因为代码只隐藏在第一行,我需要使用int []数组来排列所有像素,然后排列像素的顶行,然后打印出ASCII文本中的红色值。

1 个答案:

答案 0 :(得分:1)

我不熟悉类PicturePixel,因为它们不在标准库中,但如果this是您正在使用的Pixel类,尝试以下方法:

  • 创建方法decodeMessage(Picture image),并使用Pixel获取image.getPixels()数组,就像在encodeMessage()中一样。
  • 遍历消息位(使用您在编码结束时放置的255作为序列结束的指示符)并使用pixelTarget.getRed()读取值。这些值对应于编码的二进制值。为这些位生成一个数组。
  • 现在您必须将每个7位块转换为整数。像here一样使用按位运算,并将生成的int值转换为char值(例如here)。*
  • 将数组传递给char构造函数,将String数组转换为String
  • 打印字符串。

(*)请记住,二进制表示是不明确的,因此您必须确定用于ASCII位的字节顺序