所以我在这里做一个普林斯顿练习:http://www.cs.princeton.edu/courses/archive/fall10/cos126/assignments/lfsr.html 我已经完全通过LFSR类测试了所提供的数据,所以我确信我没有出错。但是,我的PhotoMagic类会生成管道的加密照片,如下所示:
这不是它应该出现的方式。知道我的代码出错了吗?
import java.awt.Color;
public class PhotoMagic
{
private LFSR lfsr;
public static void main(String args[])
{
new PhotoMagic("src/pictures/shield.png","01101000010100010000",16);
}
public PhotoMagic(String imageName,String binaryPassword,int tap)
{
Picture pic = new Picture(imageName);
lfsr = new LFSR(binaryPassword,tap);
for (int x = 0; x < pic.width(); x++)
{
for (int y = 0; y < pic.height(); y++)
{
Color color = pic.get(x, y);
int red = color.getRed();
int blue = color.getBlue();
int green = color.getGreen();
int transparency = color.getTransparency();
int alpha = color.getAlpha();
int newRed = xor(Integer.toBinaryString(red),paddedBitPattern(lfsr.generate(8)));
int newGreen = xor(Integer.toBinaryString(green),paddedBitPattern(lfsr.generate(8)));
int newBlue = xor(Integer.toBinaryString(blue),paddedBitPattern(lfsr.generate(8)));
Color newColor = new Color(newRed, newGreen, newBlue);
pic.set(x, y, newColor);
}
}
pic.show();
}
/**
* Pads bit pattern to the left with 0s if it is not 8 bits long
* @param bitPattern
* @return
*/
public String paddedBitPattern(int bitPattern)
{
String tempBit = Integer.toBinaryString(bitPattern);
String newPattern = "";
for(int i = 1; i < 9-tempBit.length(); i++)
{
newPattern += "0";
}
newPattern += tempBit;
return newPattern;
}
/**
* Performs the bitwise XOR
* @param colorComponent
* @param generatedBit
* @return
*/
public int xor(String colorComponent, String generatedBit)
{
String newColor = "";
for(int i = 0; i < colorComponent.length(); i++)
{
if(colorComponent.charAt(i) != generatedBit.charAt(i))
{
newColor += 1;
}
else
{
newColor += 0;
}
}
return Integer.valueOf(newColor,2);
}
}
答案 0 :(得分:2)
问题可能出在这段代码中
public String paddedBitPattern(int bitPattern)
{
String tempBit = Integer.toBinaryString(bitPattern);
String newPattern = "";
for(int i = 1; i < 9-tempBit.length(); i++)
{
newPattern += "0";
}
newPattern += tempBit;
return newPattern;
}
请注意,newPattern
以长度为零的字符串开头,然后为bitPattern
中的每个位添加一个文本零。然后将bitPattern
添加回newPattern
并返回结果。这导致100%非随机结果,这是您刚刚提交的同一bitPattern
的零填充版本。
所以如果输入是
0010101101
输出将是
00000000000010101101
其中(当删除前导零时)正好是输入
0010101101
由于没有增加复杂性,它不会破坏思维在边缘检测方面的能力:很容易看到模式。
答案 1 :(得分:2)
在计算newRed,newGreen和newBlue时,需要填充Integer.toBinaryString()的结果。它的长度可能不是8。
答案 2 :(得分:0)
我修改如下。它奏效了。
int newRed = xor(paddedBitPattern(red),paddedBitPattern(lfsr.generate(8)));
int newGreen = xor(paddedBitPattern(green),paddedBitPattern(lfsr.generate(8)));
int newBlue = xor(paddedBitPattern(blue),paddedBitPattern(lfsr.generate(8)));