Perl将二进制流转换为十六进制

ekr*_*urg 3 perl hex stdin

我遇到的问题是当我有一个Perl脚本通过STDIN读取数据(PE可执行文件)并且流包含行终止符"0A"时,转换为十六进制错过了它.然后,当我将十六进制数据转换回来时,它已损坏(以十六进制格式丢失0A).那么如何在Perl中检测换行符"0A"的"windows"版本呢?

注意:Linux OS(Perl)正在读取Windows PE

!usr/bin/perl

while($line = <STDIN>)
{
    chomp($line);
    @bytes = split //, $line;
    foreach (@bytes)
    {
        printf "%02lx", ord $_;
    }
}
Run Code Online (Sandbox Code Playgroud)

用法示例:

[root@mybox test]# cat test.exe | perl encoder.pl > output
Run Code Online (Sandbox Code Playgroud)

Eri*_*rom 6

在循环中,您chomp在每个输入行上运行.这将删除$/您行末尾的当前值.这是可能的0x0a,这就是价值的来源.尝试chomp($line)从循环中删除.

通常,使用面向行的读取对于本身不是面向行的二进制文件没有意义.您应该查看较低级别的read函数,它允许您从文件中读取一个字节块,而无需关心这些字节是什么.然后,您可以使用块而不是行来处理数据.

  • 另外,你会发现`unpack('H*',$ binary_string)`比`split`和`printf'%02x'更有效. (3认同)