Я хотел бы выполнить операцию 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;
}
Спасибо, извините за мой плохой английский.