查找未知分隔符的归档文件中的文件位置

时间:2018-08-07 02:09:36

标签: perl

我有许多大型二进制存档文件,每个文件都包含其他文件的集合。我知道文件的位置,起始位置(固定偏移量)和长度(变化但可以找到它),所以我可以提取它。

该文件结束后,下一个文件之前将有一个NUL字符序列,其长度取决于先前文件数据的大小。

我现在有自己的解决方案,该解决方案是通过搜索第一个非NUL字符来找到文件之间的填充符长度。

my @KNOWNFILE_FillerSize;

# Continue from the extraction/read of the previous known file
# (to get the unknown offset of the EOF)
my $KNOWNFILE_EOF_CurrentLocation = tell $bin;

# Read a large amount, just in case the space is insanely large
read($bin, my $KNOWNFILE_FillerSize, 0x183E1); 

while ( $KNOWNFILE_FillerSize =~ m/($Null_Filler_Search)/g ) { # [^\x00]

    my $KNOWNFILE_FillerSize        = $1;
    my $KNOWNFILE_FillerSize_Offset = $-[0] + $KNOWNFILE_EOF_CurrentLocation;

    push @KNOWNFILE_FillerSize, "$KNOWNFILE_FillerSize_Offset";
}

my $KNOWNFILE_FillerSize_FirstOffset = $KNOWNFILE_FillerSize[0];
my $KNOWNFILE_FillerSize_Result      = $KNOWNFILE_FillerSize_FirstOffset - $KNOWNFILE_EOF_CurrentLocation;

尽管这可行,但我必须重新读取已知文件,寻找其偏移量并读取其数据,以便可以回到文件末尾。从那里,我使用现在已知的填充大小,并将其添加到文件偏移量的末尾,以便获取下一个文件的开始。有更好的方法吗?

更新:现在我有一个类似的新问题,我需要计算与此相反的问题。我有数据,现在我需要知道它的动态端点(因此我最终不知道文件的大小,但是我知道它以FF填充符结尾)。我尝试了各种正则表达式来匹配所有非FF或仅匹配ISNT FF的数据。似乎无济于事...我很想对此提出另一个问题。

1 个答案:

答案 0 :(得分:1)

  

我必须重新读取已知文件,寻找其偏移量并读取其数据

不,您当然不会。您说您知道文件的长度,所以从seek$file_start + $file_length

如果填充符最大为0x1ED0字节,则只需读取0x2000字节并找到第一个0x01字符即可。无需阅读以下所有文件。

修复您的变量名。一切都以KNOWNFILE开始,它们看起来都一样,因为眼睛吸引了首都。 (此外,您实际上不能在 unknown 文件中包含一个包含数据的变量。my $filler_size更具可读性,根本没有任何大写字母,并且Perl标识符的常规格式。大写字母通常用于全局变量和程序包名称。