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

时间:2010-11-23 21:07:53

标签: 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 $_;
    }
}

用法示例:

[root@mybox test]# cat test.exe | perl encoder.pl > output

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:1)

#With split
cat magic.exe | perl -e 'print join("", map { sprintf("\\x%02x", ord($_)) } split(//, join("", <STDIN>)))' > hex_encoded_binary

#With pack
cat magic.exe| perl -e 'print join("", map { "\\x" . $_ } unpack("H*", join("", <STDIN>)) =~ /.{2}/gs)' > hex_encoded_binary
相关问题