我想签署一个 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/