我想在我的代码中执行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;
}

谢谢你对我的英语不好。

#1楼 票数:0

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

看一下DataInputStream.readFully()作为一个简单的解决方案。

  ask by david translate from so

未解决问题?本站智能推荐:

4回复

无法在jar文件中的Java中打开文件

我试图从Java应用程序打开文件。 使用以下代码 从Java应用程序即时打开PDF文件 码: 当我使用像这样的路径时: 它打开。 但是我的文件在我的包里 我用了 它显示以下异常: 为什么? 任何想法...我想将我的文件包含在jar文件中,该文件可以在用户需要时从
4回复

使用FileStream在Java中复制文件

我想使用FileStream在Java中复制文件。 这是我的代码。 我使用vim来查看我的文件。 输入文件“in” 输出文件“输出” 输出文件中有许多额外的'^ @'。 输入文件的大小为39字节。 输出文件的大小为1KB。 为什么输出文件中有很多额外的字符?
1回复

在Java中更改属性文件的值

我的应用程序中有一个属性文件,该文件具有两个属性(用户名,密码)。 当我按下gui上的Button时,我想更改这些属性的值! 问题是我的属性文件存储在项目的程序包中,而不是在根文件夹中,因此当我按下按钮时,将触发“找不到文件异常”,并且更改未生效! 我试图更改路径,但结果保持不变,引发异常
1回复

Java向文件读写字节

在我制作的程序中,我将某些值作为字节保存到文件中,并且我想加载该文件并读取每个字节dis.read(); 但是每次我这样做时,值都会不正确。 这是我的保存代码: 这是加载代码:
1回复

如何从Java中的任何文本文件中找到偶数和奇数[复制]

这个问题已经在这里有了答案: “找不到符号”编译错误是什么意思? 12个答案 我想从任何文本文件中找到偶数和奇数,并将偶数存储在一个文本文件(即dataeven.txt)中,将奇数存储在另一个文件(即dataodd.txt)中。 我已经尝试了很多次,但是我没有找到错误,它显
1回复

Java:在二进制文件中搜索特定字节并替换或省略所述字节

我需要在文件中搜索“test”这个词。 我使用的文件是一个文本文件,但我将在二进制文件上使用它。 下面的代码看起来应该对我有用,但它不起作用。 我能够在文件中显示“test”的实例,但我无法让它基本上不在创建的文件中写入“test”。 请问有什么帮助吗? 感谢你们提供的帮助。 我没有遇到数组问题。
1回复

Java中的套接字通信后错误读取文件

我有通过套接字从服务器发送到客户端的文件。 但是,当我尝试在客户端中获取前159个第一个字节时,所得到的结果要小于要求服务器读取原始文件中相同数量的结果,但是当我打印双方读取的长度时一样,但是一个几乎是另一个的2/3! 可能是什么问题呢? 我已经做了replaceAll("(\\\\r|\
1回复

FileOutputStream或使用Java文件的任何创建文件是默认在Eclipse主文件夹的相对路径中创建的。

这个问题已经在这里有了答案: Java FileOutputStream:相对于程序文件夹的路径? 5个答案 图片: https : //i.stack.imgur.com/nB9Ys.jpg 每当我使用文件创建代码时,.file不在Eclipse项目的内部文件夹中创建