我想在我的代码中执行XOR操作。但是我在输出上有奇怪的行为。有时结果是正确的,但有时候不是。 情况如下: 我有一个文件,我已经分成两部分,然后我在两个文件(源文件)上使用xor操作创建了一个奇偶校验文件。所以现在我有三个文件。然后我删除了一个源文件。我想在奇偶校验文件和剩余的源文件之间的xor操作中检索丢失的文件。我正在使用哈希函数来检查输出是否正确。如果函数只被调用一次,一切都很好,但每当我有很多操作来检索其他文件上的丢失文件时,有时我的函数会生成错误的结果。 当它们生成错误的结果时,它始终生成相同的文件。但是如果我将thread.sleep放置1秒钟,即使我的操作超过1000次,它们也会生成正确的结果。
有人可以帮我发现我的代码中哪一部分坏了吗?
private byte[] parityByte(byte[] firstByte, byte[] secondByte) {
int size1;
size1 = firstByte.length;
int size2;
size2 = secondByte.length;
byte[] parity;
parity = new byte[size1];
for (int i = 0; i < size2; i++) {
parity[i] = (byte) (firstByte[i] ^ secondByte[i]);
}
for (int i = size2; i < size1; i++) {
parity[i] = firstByte[i];
}
return parity;
}
/**
* get original chunks
*/
public Chunk getOriginal(Chunk parity, Chunk compare, String orig) throws FileNotFoundException, IOException {
File par = new File(parity.getHash());
InputStream parity = new BufferedInputStream(new FileInputStream(parity.getHash()));
InputStream source = new BufferedInputStream(new FileInputStream(compare.getHash()));
int size = (int) par.length();
int bufferSize = size;
byte[] firstBuffer = new byte[size];
byte[] secondBuffer = new byte[size];
long remainSize;
byte[] destByte = new byte[1];
parity.read(destByte, 0, 1);
Integer dest = new Integer(destByte[0]);
remainSize = size - 1 - dest;
OutputStream originalChunk;
originalChunk = new FileOutputStream(orig);
while (remainSize > 0) {
if (remainSize > bufferSize) {
remainSize -= bufferSize;
} else {
bufferSize = (int) remainSize;
firstBuffer = new byte[bufferSize];
secondBuffer = new byte[bufferSize];
remainSize = 0;
}
parity.read(firstBuffer, 0, bufferSize);
source.read(secondBuffer, 0, bufferSize);
originalChunk.write(parityByte(firstBuffer, secondBuffer));
}
originalChunk.flush();
parity.close();
source.close();
originalChunk.close();
Chunk tempChunk = Chunk.newChunk(orig);
return tempChunk;
}
谢谢 抱歉我的英语不好。
答案 0 :(得分:0)
您假设所有读取都填充缓冲区。检查Javadoc。 read(byte [] ...)方法返回一个值,这是有原因的。
查看DataInputStream.readFully()以获得一个简单的解决方案。