我从同事那里收到了一个 tar 存档,解压缩后我发现一些文本文件已损坏。更准确地说,它们是用零填充的。它们具有正确的大小,但所有字节都等于 0x00。
这种情况是否是由于 tar 版本的某些不兼容造成的,或者例如。文件中包含中文字符或文件在压缩时已损坏?我预计传输过程中不会出现问题,因为控制校验和正常。
答案1
你确定吗全部字节等于0x00
?在这种情况下,您的文件根本不包含任何信息(除了它们的大小)。没有程序可以将信息存储或传输为全零(除非它是心灵感应的)。
什么能发生的情况是文件具有交替的文本和零字节。这意味着:您收到了包含 unicode 文本的文件,编码为 UTF-16(或接近等效的编码)。每个字符占用 16 位(两个字节)。 Unicode 将英文字母和符号分配给它们的 ASCII 字符代码,这意味着,例如,字母A
在 ASCII 中是十六进制 41,在 Unicode 中是 00 41。结果是,如果您将“Hello”写为 UTF-16 并将其读入 8 位文本,您将看到以下内容:
\0 H \0 e \0 l \0 l \0 o
那样的话,就不是自己的错了tar
。但是,如果您确实收到全零文件并且进行了校验和检查,则创建程序肯定有问题。不是版本问题,但谁知道呢?可能是硬件问题导致生成程序读取全零。
(当然,也有可能文件已正确存档,并且错误存在于程序中已创建存档文件)。
答案2
最可能的问题是 tar 在创建时被损坏。由于 tar 格式的定义方式(因为它旨在成为流式存档器),它必须提前确定文件长度。它将这个长度记录在 tar 标头中,然后开始将文件内容写入 tar 文件。如果由于某种原因读取文件时出现错误,或者文件在归档时收缩,则会填充 NULL。这是必需的,以便标头中指定的长度在提取时仍然有效(由于其流式传输性质,它无法返回并修改标头,并且如果它没有用 NULL 填充文件,则会在以下情况下导致错误)提取存档中的下一个文件)。
另外,由于 tar 处理二进制数据(它没有“文本”模式),因此不同语言编码不应该有任何问题(就 tar 而言)。