1

我正在编写一个图像加密程序,其中我在图像中编码一个字符串。

我正在处理.png图像。

编码通过以下步骤执行:

  • 使用 getRGB() 将图像的像素存储在 2D 数组中。
  • 字符串中的每个字符都被转换为二进制形式并存储在一个数组中。
  • 像素的每个字节的 LSB4byte根据字符的二进制形式的每一位而改变。第一个字节的 LSB 在第 0 位,第二个字节的 LSB 在第 8 位,第三个字节在第 16 位,第四个字节在第 24 位。
  • 编码后,使用 setRGB() 方法将修改后的像素写入原始图像。

对于解码:

  • 使用 getRGB() 读取图像的像素;
  • 使用反向编码方法来检索数据。
  • 在每 8 位之后,包含解码位的 int 被转换为字符。然后为另一个字符初始化为零。

                if((pixels[i][j] & change)==1)  
                {
                    tempText|=1 ;
                }
    
                tempText<<=1;
    

变化为 1,256,65536,16777216,具体取决于迭代。第 0、8、16 和 24 位为 1。

代码编译得很好。但解码后,我在输出中得到奇怪的 ascii 字符。我找不到原因。所以我在这里咨询专家。

4

1 回答 1

0

(评论太长了)

你写了:

诠释改变=0;

                            for(int k=0;k<4;k++)
                            {
                                    if(k==0)
                                    {
                                            change=1;
                                    }
                                    else
                                            if(k==1)
                                            {
                                                    change=256;
                                            }
                                            else
                                                    if(k==2)
                                                    {
                                                            change=65536;
                                                    }
                                                    else
                                                            if(k==3)
                                                            {
                                                                    change = 16777216;
                                                            }

那里有很多重复。通常,计算机非常擅长消除重复。

如果我没有被这一个班轮弄错,这可以重写:

final int change = 1 << 8 * k;
于 2013-01-20T17:46:29.733 回答