【发布时间】:2019-02-16 00:04:26
【问题描述】:
我目前正在研究 PE 结构。 我正在尝试使用 perl 而不是 C 来解析它。
这不是什么重要的事情,但是如果你读取一个二进制文件,你必须跳转到某个部分。 (例如,读取 e_lfanew)
我要读取0x78点的数据,$buf读取的数据为0x200。
我想到了两种提取 0x78 处数据的方法。
my ($ dummy, $ data) = unpack ("A0x78 A*", $buf);
or
seek (F, 0x78,0); read F, $buf, 0x200; print ~
我想知道这两种方法中哪一种比减去dummy data和读取数据和通过seek读取新数据更有效。
【问题讨论】:
-
(1) Benchmark 和 Time::HiRes (2) 你展示的东西是无与伦比的:在一种情况下你使用
unpack,在另一种情况下你使用read数据; (不管缓冲)您正在比较内存中的工作和磁盘读取?最后一句不清楚。 -
提示:使用
x而不是A跳过字节而不返回它们 -
提示:二进制数据使用
a而不是A。A将删除尾随0x20字节 -
这会给你留下
my $data = unpack("x0x78 a*", $buf); -
哇,我第一次注意到名为“x”的解包功能。谢谢你告诉我