0

コードで XOR 操作を実行したいと思います。ただし、出力で奇妙な動作が発生します。結果が正しい場合もあれば、そうでない場合もあります。状況は次のとおりです。すでに 2 つの部分に分割されているファイルがあり、両方のファイル (ソース ファイル) で xor 操作を使用して 1 つのパリティ ファイルを作成しました。これで、3 つのファイルができました。次に、ソースファイルの1つを削除しました。欠落ファイルについて、パリティファイルと残りのソースファイルのxor演算で欠落ファイルを取得したい。ハッシュ関数を使用して、出力が正しいかどうかを確認しています。関数が 1 回だけ呼び出された場合は問題ありませんが、他のファイルで不足しているファイルを取得する操作を何度も行うと、関数が間違った結果を生成することがあります。彼らが間違った結果を生み出すとき、それは' 常に同じファイルを生成します。しかし、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;
}

私の悪い英語をありがとう。

4

1 に答える 1

0

すべての読み取りでバッファーがいっぱいになると想定しています。Javadoc を確認してください。read(byte[] ...) メソッドは値を返しますが、それには理由があります。

簡単な解決策については、 DataInputStream.readFully() をご覧ください。

于 2012-09-17T22:59:47.063 に答える