Gzip

如何獲取 gzip 存檔的尾隨數據?

  • January 29, 2017

我有一個帶有尾隨數據的 gzip 存檔。如果我使用gzip -d它解壓它,它會告訴我:“解壓OK,忽略尾隨垃圾”(同樣gzip -t可以用作檢測是否存在此類數據的方法)。

現在我想了解這個垃圾,但奇怪的是我找不到任何方法來提取它。gzip -l --verbose告訴我存檔的“壓縮”大小是文件的大小(即帶有尾隨數據),這是錯誤的並且沒有幫助。file也無濟於事,那我該怎麼辦?

現在想通瞭如何獲取尾隨數據。

我創建了 Perl 腳本,它創建了一個帶有尾隨數據的文件,它很大程度上基於https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=604617#10

#!/usr/bin/perl
use strict;
use warnings; 

use IO::Uncompress::Gunzip qw(:all);
use IO::File;

unshift(@ARGV, '-') unless -t STDIN;

my $input_file_name = shift;
my $output_file_name = shift;

if (! defined $input_file_name) {
 die <<END;
Usage:

 $0 ( GZIP_FILE | - ) [OUTPUT_FILE]

 ... | $0 [OUTPUT_FILE]

Extracts the trailing data of a gzip archive.
Outputs to stdout if no OUTPUT_FILE is given.
- as input file file causes it to read from stdin.

Examples:

 $0 archive.tgz trailing.bin

 cat archive.tgz | $0

END
}

my $in = new IO::File "<$input_file_name" or die "Couldn't open gzip file.\n";
gunzip $in => "/dev/null",
 TrailingData => my $trailing;
undef $in;

if (! defined $output_file_name) {
 print $trailing;
} else {
 open(my $fh, ">", $output_file_name) or die "Couldn't open output file.\n";
 print $fh $trailing;
 close $fh;
 print "Output file written.\n";
}

引用自:https://unix.stackexchange.com/questions/295702