【问题标题】:Perl one liner to seek to offset in filePerl 在文件中寻找偏移量的一行
【发布时间】:2021-08-13 01:07:43
【问题描述】:

有没有办法指定从命令行读取二进制文件中某个位置/偏移量的文件字节? (即单行) 例如

perl -ne <...seek n bytes into file... do stuff...> inputfile

我没有看到这个,并尝试过使用 seek、sysseek 等。

只是想通过读取文件中不同偏移量的字节长度来试验packunpack

更新

除了接受的答案之外,我只想添加以下等效答案,但(对我而言)更容易记住+阅读

perl -lne 'BEGIN{$/=undef, $offset=1, $len=2} print unpack("H*", substr($_, $offset, $len))' input

更新2 为了进行 hexdumps 以下工作

perl -0777 -ne '(printf "0x%02x ", $_) for (unpack "C*", substr($_, 0x1, 0x2))' input

【问题讨论】:

    标签: perl binaryfiles one-liner


    【解决方案1】:
    perl -M5.010 -0777ne'say unpack("N", substr($_, 0x20, 4))' inputfile
    

    您正在使用-n,它将文件的一行读入$_。二进制文件没有行,所以我们将使用-0777 告诉 Perl 将整个文件视为一行。由于会发生 CRLF 转换,因此无法在 Windows 中工作。


    对于实际寻找,

    perl -M5.010 -MFcntl=SEEK_SET -e'
       open(my $fh, "<:raw", $ARGV[0]) or die $!; 
       seek($fh, 0x20, SEEK_SET) or die $!;
       local $/ = \4;
       length( my $buf = <$fh> ) == 4 or die "Error";
       say unpack("N", $buf);
    ' inputfile
    

    如果您想将换行符全部放在一行上,可以删除换行符。

    【讨论】:

    • 太棒了!在移动自动取款机上,但一旦我在电脑上并且能够测试,就不能接受。
    • 有没有办法在输出中的每个解包单元之间放置空间? $\=" " 不适合我。我想得到一个 hexdump 样式的输出。
    • 也许使用split
    猜你喜欢
    • 1970-01-01
    • 2020-12-05
    • 1970-01-01
    • 2019-04-26
    • 1970-01-01
    • 2018-09-04
    • 2013-07-14
    • 2021-04-25
    • 1970-01-01
    相关资源
    最近更新 更多