我正在编写一个图像加密程序,在其中对图像内的字符串进行编码。
我正在处理 .png
图像。
编码通过以下步骤执行:
- 图像的像素使用 getRGB() 存储在二维数组中。
- 字符串中的每个字符都会转换为二进制形式并存储在数组中。
4byte
像素的每个字节的LSB根据字符的二进制形式的每一位而改变。第一个字节的 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 字符。我找不到这其中的原因。所以我在这里咨询专家。
最佳答案
(对于评论来说太长了)
你写道:
int 变化=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;
关于java - Java 编码图像解码输出中出现奇怪的 Ascii 字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14427196/