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

标签 c

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

相关文章:

无法识别类型(双复合体)

c - ISAPI扩展

c - 如何设计和实现触发 C 语言部分代码的可调度警报/事件

c - 在文件中查找不同字符的实例

c - 功能级别是否影响主变量的内存分配区域

python - 在 python 文件中导入带有 python 绑定(bind)的 C 文件

c - 具有相同 clrscr() 的程序如何,即带有逗号运算符的 clrscr 命令

c - 读取结构内部的字符时有什么问题吗?

c++ - FFT 问题(返回随机结果)

python - 对 recvbuf 进行操作的 MPI_Sendrecv?