繁体   English   中英

反转二进制文件会向其添加位而不会反转

[英]Reversing a binary file adds bits to it and not reversing

我正在编写一个函数来获取带有整数的二进制文件并反转它们的顺序。 例如,我有这个二进制文件(十六进制):

00 00 00 01 00 00 00 02 00 00 00 03 00 00 00 04

我希望它是:

00 00 00 04 00 00 00 03 00 00 00 02 00 00 00 01

但是通过我的算法,我得到了这个:

00 00 00 01 00 00 00 02 00 00 00 03 00 00 00 04 CC CC CC CC 00 00 00 00  CC CC CC CC

我不明白为什么......这是我的算法:

void reverse(FILE * fr)
{
    int i, num1, num2, fileLength;
    fseek(fr, 0, SEEK_END);
    fileLength = ftell(fr) / sizeof(int);
    for(i = 0; i < fileLength / 2; i++)
    {
        fseek(fr, i * sizeof(int), SEEK_SET);
        fread(&num1, sizeof(int), 1, fr);
        fseek(fr, i * sizeof(int), SEEK_END);
        fread(&num2, 4, 1, fr);
        fseek(fr, i * sizeof(int), SEEK_END);
        fwrite(&num2, sizeof(int), 1, fr);
        fseek(fr, i * sizeof(int), SEEK_SET);
        fwrite(&num1, sizeof(int), 1, fr);
    }
}
int main()
{
    FILE * f = fopen("test.bin", "r+b");
    reverse(f);
    fclose(f);
    getchar();
    return 0;
}

我究竟做错了什么?

编辑:给我一个文件大小除以sizeof(int)。

编辑2:

在pts指出更改代码后,它仍然无法正常工作。 它输出:

CC CC CC CC CC CC CC CC 00 00 00 03 00 00 00 04 00 00 00 01 00 00 00 00 00 00 00 02

我编辑的代码如上所示。

(顺便说一句,对于所有的评论者,我被告知不要将整个文件读取到内存然后反转它,因为它应该是文件操作的练习,而不是内存操作。)

谢谢。

尝试这个:

void reverse(FILE * fr)
{
    int i, num1, num2, fileLength;
    fseek(fr, 0, SEEK_END);
    fileLength = ftell(fr) / sizeof(int);
    for(i = 0; i < fileLength / 2; i++){
        fseek(fr, i * sizeof(int), SEEK_SET);
        fread(&num1, sizeof(int), 1, fr);
        fseek(fr, (-1-i) * sizeof(int), SEEK_END);
        fread(&num2, sizeof(int), 1, fr);
        fseek(fr, (-1-i) * sizeof(int), SEEK_END);
        fwrite(&num1, sizeof(int), 1, fr);
        fseek(fr, i * sizeof(int), SEEK_SET);
        fwrite(&num2, sizeof(int), 1, fr);
    }
}

int, int, int, int[EOF]
                  ^fseek(filep, 0, SEEK_END)
               ^
               fseek(filep, -1*sizeof(int), SEEK_END)

在中间,你必须再次寻求。 写入时使用num1和num2也是错误的。

    fread(&num2, 4, 1, fr);
    fseek(fr, i * sizeof(int), SEEK_END);  // Add this.
    fwrite(&num1, sizeof(int), 1, fr);     // num1.
    fseek(fr, i * sizeof(int), SEEK_SET);
    fwrite(&num2, sizeof(int), 1, fr);     // num2.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM