gpt4 book ai didi

archive - tar 格式的 header 和结构

转载 作者:行者123 更新时间:2023-12-02 18:51:14 25 4
gpt4 key购买 nike

我有一个学校项目,这意味着制作一个在unix系统中像tar一样工作的c程序。我有一些问题希望有人向我解释:

  1. 存档的维度。我(通过浏览互联网)了解到存档具有定义数量的 block ,每个 block 512 字节。因此 header 有 512 字节,然后是文件内容(如果只有一个要存档的文件),以 512 字节 block 的形式组织,然后再组织 2 个 512 字节 block 。

    例如:假设我有一个 0 字节的 txt 文件要存档。这应该意味着要使用 512*3 字节的数量。为什么当我在 unix 中使用 tar 函数并单击属性时,它有 10.240 字节?我认为它添加了一些 0 (NULL) 字节,但我不知道在哪里、为什么以及有多少...

  2. header 校验和。 据我所知,这应该是存档的大小。当我使用 hexdump -C 检查它时,它看起来像一个接近存档实际大小(单击属性时)的数字。例如,如果我存档 0 字节 txt 文件,则为 11200 或 11205 或类似的值。这个大小是八进制还是十进制?我打赌它是八进制的,因为您放入 header 中的所有信息都需要是八进制的。此时我的第二个问题是,在 10240 字节的原始大小基础上添加了哪些内容?

  3. header 模式。假设我有一个 664 的文件,格式文件将为 0,那么我应该放入 header 0664。为什么,在正宗的存档上会打印 3开头多了 0 (000064) ?

最佳答案

tar 格式有多种版本,并且并非所有先前格式的扩展都始终相互兼容。所以总是会有一些猜测。例如,在非常古老的unix系统中,文件名不允许超过14个字节,因此文件名(包括路径)的空间是充足的;后来,文件名更长,必须扩展,但没有空间,所以文件名被分成两部分;甚至后来,gnu tar 引入了 @@LongLink 伪符号链接(symbolic link),这将使旧的 tar 至少将文件恢复为其原始名称。

1) Tar 最初是*T*ape *Ar*chiver。为了实现磁带的恒定吞吐量并避免过多地启动/停止磁带,需要一次写入多个 block 。默认为 20 个 512 字节的 block ,-b 选项用于设置 block 数。通常,该大小是由硬件预先定义的,并且使用错误的阻塞系数会导致生成的磁带无法使用。这就是为什么 tar 附加\0 填充的 block ,直到 tar 大小是 block 大小的倍数。

2) 文件大小为八进制,包含放入 tar 中的原始文件的真实大小。它与 tar 文件的大小无关。校验和是根据 header 字节的总和计算的,但随后也存储在 header 中。因此,存储校验和的行为会更改 header ,从而使校验和无效。这就是为什么您首先存储所有其他 header 字段,将校验和设置为空格,然后计算校验和,然后用您计算的值替换空格。

请注意,压缩文件的 header 是纯 ascii。这样,在过去,当 tar 文件(其组件是纯 ascii)损坏时,管理员只需使用编辑器打开 tar 文件并手动恢复组件即可。这就是为什么 tar 格式的设计者害怕\0 字节并使用空格来代替。

3) Tar 文件可以存储 block 设备、字符设备、目录等内容。 Unix 将这些文件模式存储在与权限标志相同的位置,并且头文件模式包含整个文件模式,包括文件类型位。这就是为什么该数字比纯权限长的原因。

http://en.wikipedia.org/wiki/Tar_%28computing%29 有很多信息也是如此。

关于archive - tar 格式的 header 和结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21078479/

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