我有一个简单的应用程序(现在)模拟大型数组中的纠错。
该位生成数据,并为每个255字节的块添加16字节的Reed-Solomon奇偶校验。
ReedSolomonEncoder encoder = new ReedSolomonEncoder(QR_CODE_FIELD_256);
int[][] data = new int[params.getNumBlocks()][255];
int[][] original = new int[params.getNumBlocks()][];
int value = 0;
for (int i = 0; i < params.getNumBlocks(); i++) {
int[] block = data[i];
for (int j = 0; j < 239; j++) {
value = (value + 1) % 256;
block[j] = value;
}
encoder.encode(block, 16);
original[i] = Arrays.copyOf(block, block.length);
// Corrupt a byte
block[50] += 1;
}
这是我的核心:
public class RsKernel implements Kernel {
private final int[] block;
public RsKernel(int[] block) {
this.block = block;
}
@Override
public void gpuMethod() {
block[50] -= 1;
}
}
它只是手动恢复每个块中的损坏字节(它不会进行实际的Reed-Solomon纠错)。
我使用以下代码运行内核:
ArrayList<Kernel> kernels = new ArrayList<>(params.getNumBlocks());
for (int[] block : data) {
kernels.add(new RsKernel(block));
}
new Rootbeer().run(kernels);
我使用JUnit
的{{1}}验证解码:
assertArrayEquals
奇怪的是,如果我运行这个代码最多8192(多么可疑的数字)块(内核),报告数据已被正确解码;对于8193个及以上的块,不正确解码:
Assert.assertArrayEquals(original, data);
什么可能导致这种行为?
以下是Exception in thread "main" arrays first differed at element [8192][50]; expected:<51> but was:<52>
at org.junit.Assert.internalArrayEquals(Assert.java:437)
at org.junit.Assert.internalArrayEquals(Assert.java:428)
at org.junit.Assert.assertArrayEquals(Assert.java:167)
at org.junit.Assert.assertArrayEquals(Assert.java:184)
at com.amphinicy.blink.rootbeer.RootBeerDemo.main(Jasmin)
的输出:
java -jar rootbeer-1.1.14.jar -printdeviceinfo
答案 0 :(得分:1)
查看代码,我认为可能因为以下内容:
// Corrupt a byte
block[50] += 1;
可以添加1到255,给出256不是有效字节。使用类似的方法破坏字节可能会更好:
block[50] ^= 0x40;
这会将位置7中的位翻转而不是添加以破坏该字节。