(спросить) Проблема вычисления XOR в файле в java

Я хотел бы выполнить операцию 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;
}

Спасибо, извините за мой плохой английский.


person david    schedule 17.09.2012    source источник


Ответы (1)


Вы предполагаете, что все операции чтения заполняют буфер. Проверьте Javadoc. Метод read(byte[] ...) возвращает значение, и это не просто так.

Взгляните на DataInputStream.readFully() для простого решения.

person user207421    schedule 17.09.2012
comment
Спасибо @ejp, но использование DataInputStream.readFully() по-прежнему не работает. - person david; 29.10.2012