【问题标题】:(ask) XOR calculation issue on file in java(问)java文件中的异或计算问题
【发布时间】:2012-09-09 17:27:37
【问题描述】:

我想在我的代码中执行异或运算。但是我在输出上有奇怪的行为。有时结果是正确的,但有时不是。 情况如下: 我有一个已经分成两部分的文件,然后我在两个文件(源文件)上使用 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;
}

谢谢 对不起我的英语不好。

【问题讨论】:

    标签: java xor fileinputstream fileoutputstream parity


    【解决方案1】:

    您假设所有读取都填满了缓冲区。检查Javadoc。 read(byte[] ...) 方法返回一个值,这是有原因的。

    查看 DataInputStream.readFully() 以获得简单的解决方案。

    【讨论】:

    • 感谢@ejp,但使用 DataInputStream.readFully() 仍然不起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-19
    • 2012-05-04
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多