C语言 在从 CPIO 生成的文件中填充额外的字节



我在一个目录中有一个文件列表,我想创建一个存档格式文件。我使用 CPIO 将文件创建为

ls |  cpio -ov -H crc > demo.cpio

我有一个这样的 cpio 结构

struct cpio_newc_header {
char    c_magic[6];
char    c_ino[8];
char    c_mode[8];
char    c_uid[8];
char    c_gid[8];
char    c_nlink[8];
char    c_mtime[8];
char    c_filesize[8];
char    c_devmajor[8];
char    c_devminor[8];
char    c_rdevmajor[8];
char    c_rdevminor[8];
char    c_namesize[8];
char    c_check[8];
};

我可以使用 c_filesize,c_namesize 获取标头中的元数据、路径名、文件数据。我可以根据c_filesize获取文件数据,但是在获取文件数据后,会填充一些额外的位,即在文件数据之后和下一个标头之前。

00000230: 6e63 6965 7322 3a5b 5d0d 0a7d 0d0a 0000  ncies":[]..}....
00000240: 3037 3037 3032 3030 3636 4246 3838 3030  0707020066BF8800

在这里,我们可以观察到在"}"之后填充了一些额外的字节。我教了它四的倍数四舍五入,但我观察到其他一些数据不是四的倍数

00000450: 2066 6f72 2063 7279 7074 6f20 7665 7269  for datapo veri
00000460: 6669 6361 7469 6f6e 0a00 0000 3037 3037  fication....0707

为什么额外的字节是填充的。我们在做 CPIO 时可以避免吗?

来自 cpio 的手册页(新 ASCII 格式部分(:

路径名后跟 NUL 字节,因此固定标头加路径名的总大小是 4 的倍数。同样,文件数据填充为四个字节的倍数。请注意,此格式仅支持 4 GB 文件(与支持 8 GB 文件的旧 ASCII 格式不同(。

参见 man 5 cpio

在第二个示例中,它也填充为 4 字节对齐:

00000460: 6669 6361 7469 6f6e 0a00 0000 3037 3037  fication....0707

您会看到,数据以0x468结尾,并添加了三个额外的零字节用于填充,因此下一个块可以从0x46c开始。

执行此填充可能是为了避免在将标头字段读入内存后对标头字段进行未对齐的访问。它是规范的一部分,因此没有选择可以避免它。

但是很容易计算出来。如果偏移量x是文件结束后的下一个字节,则下一个标头从偏移量开始

int nextheader = (x+3)&~3;

相关内容

  • 没有找到相关文章

最新更新