gpt4 book ai didi

c - tar.gz 文件出现意外的文件结尾

转载 作者:行者123 更新时间:2023-11-30 14:36:27 25 4
gpt4 key购买 nike

我想签署一个 tar.gz 文件并验证签名,为此我在文件中放置了一个签名(以字符形式)。然后我有另一个可执行文件检查签名,如果她可以删除它,那么我就得到了没有我签名的文件内容,并将其复制到创建的其他文件上。

但问题是,当执行此操作时,我的 tar.gz 原始文件的大小为 141,而我新创建的文件的大小为 140。然后,当解压缩它们时,我收到以下错误消息:

gzip: stdin: unexpected end of file tar:

Child returned status 1 tar:

Error is not recoverable: exiting now

我想当我得到内容时我忘记了一个角色。我尝试使用clearerr或feof但没有成功。

这是我获取签名文件内容的代码:

#define SIZE_SIGNATURE (423)

int get_size(char *file)
{
struct stat sb;
int size = 0;

if (stat(file, &sb) == -1) {
fprintf(stderr, "Cant access the %s file\n", file);
return (-1);
}
size = sb.st_size - SIZE_SIGNATURE;
size = size / 4;
if (size <= 0) {
fprintf(stderr, "The content of the file is invalid\n");
return (-1);
}
return (size);
}


int *get_content(char *file, int size)
{
FILE *fp = NULL;
int *content = NULL;
int i = 0;

content = malloc(sizeof(int) * size);
if (!content) {
fprintf(stderr, "Error, malloc fail\n");
return (NULL);
}
fp = fopen(file,"rb");
if (!fp) {
fprintf(stderr, "Cant open %s file\n", file);
return (NULL);
}
fread(content, sizeof(int), size, fp);
fclose(fp);
return (content);
}

当我创建新文件时,我将内容放在上面,如下所示:

 fp = fopen(new_name, "a");
if (!fp) {
fprintf(stderr, "A problem has occured during file creation.\n Cant delete signature\n");
free(new_name);
return;
}
fwrite(content, sizeof(int), size, fp);

为什么我这样做:size = size/4(我不知道是否应该这样做)

他是一段小代码,用于理解我只是将三个 int 放入不可读字符中

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

void ecriture1()
{
FILE* F;
int a = 5;
int b = 6;
int d = 42;

F = fopen("test.bin","wb");
fwrite(&a,sizeof(int),1,F);
fwrite(&d,sizeof(int),1,F);
fwrite(&b,sizeof(int),1,F);
fclose(F);
}

void lecture1()
{
int *tab;
int i = 0;
int size;
struct stat sb;
FILE* F;

stat("test.bin", &sb);
F = fopen("test.bin","rb");
size = sb.st_size;
tab = malloc(sizeof(int) * size);
while (i < size) {
fread(&tab[i], sizeof(int), 1, F);
i++;
}
for (i = 0; i < size; i++)
printf("[i] = %d,", tab[i]);
printf("\n");
fclose(F);
}

int main()
{
ecriture1();
lecture1();
return 0;
}

他是我不放/4 时的结果:

[i] = 5,[i] = 42,[i] = 6,[i] = 0,[i] = 0,[i] = 0,[i] = 0,[i] = 0,[i] = 0,[i] = 0,[i] = 0,[i] = 0,

当我输入/4 时:

[i] = 5,[i] = 42,[i] = 6,

编辑:

在我的程序中,当我删除/4 并解压缩新的 .tar.gz 时,我收到此错误消息:

gzip: stdin: invalid compressed data--length error

tar: Child returned status 1

tar: Error is not recoverable: exiting now

所以我认为我应该把/4 放在正确的位置,但我无法解释这一点。

最佳答案

由于将大小除以 4,因此出现舍入错误。

我认为你这样做的原因是 size/4 是因为你稍后会这样做 sizeof(int) * size 并且如果你有 4 字节整数那么这将导致你的尺寸比您想要的大 4 倍。所以我认为你在那里写了两个相互抵消的错误。

我建议您删除 /4 以及删除 sizeof(int) * ,因此始终只让 size 为字节数。

作为奖励,这将消除您可能遇到的舍入误差,这可能是问题的全部原因。因为 141/4 = 35,25 将四舍五入为 35。然后35 * sizeof(int) = 35 * 4 = 140

另外,我不建议将任意大小的任意二进制数据存储在 int 数组中,因为 int 数组的大小应该可以被 4 整除。我可能会选择 char * 或只是 void * 而不是 int *

关于c - tar.gz 文件出现意外的文件结尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58057705/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com