我有许多大型二进制存档文件,每个文件都包含其他文件的集合。我知道文件的位置,起始位置(固定偏移量)和长度(变化但可以找到它),所以我可以提取它。
该文件结束后,下一个文件之前将有一个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的数据。似乎无济于事...我很想对此提出另一个问题。
答案 0 :(得分:1)
我必须重新读取已知文件,寻找其偏移量并读取其数据
不,您当然不会。您说您知道文件的长度,所以从seek
到$file_start + $file_length
如果填充符最大为0x1ED0字节,则只需读取0x2000字节并找到第一个0x01字符即可。无需阅读以下所有文件。
修复您的变量名。一切都以KNOWNFILE
开始,它们看起来都一样,因为眼睛吸引了首都。 (此外,您实际上不能在 unknown 文件中包含一个包含数据的变量。my $filler_size
更具可读性,根本没有任何大写字母,并且Perl标识符的常规格式。大写字母通常用于全局变量和程序包名称。