Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl将二进制流转换为十六进制_Perl_Hex_Stdin - Fatal编程技术网

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

Perl将二进制流转换为十六进制,perl,hex,stdin,Perl,Hex,Stdin,我遇到的问题是,当我有一个Perl脚本通过STDIN读取数据(PE可执行文件),并且流包含一个行终止符“0A”时,到hex的转换将丢失它。然后,当我转换回十六进制数据时,它已损坏(十六进制格式中缺少0A)。那么,如何在Perl中检测换行符“0A”的“windows”版本呢 注意:Linux操作系统(Perl)正在读取Windows PE !usr/bin/perl while($line = <STDIN>) { chomp($line); @bytes = spl

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

注意:Linux操作系统(Perl)正在读取Windows PE

!usr/bin/perl

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

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

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

带拆分的
#
#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
cat magic.exe | perl-e'打印连接(“,映射{sprintf(\\x%02x),ord($)}拆分(/,连接(“,))”)>十六进制编码的二进制 #打包 cat magic.exe | perl-e'print join(“,map{“\\x.”$}unpack(“H*”,join(“,)=~/.{2}/gs)”>hex编码的二进制文件
哇,这太尴尬了。我一头扎进了
binmode()
,甚至没有看到
chomp
。另外,你会发现
unpack('H*',$binary\u string)
split
printf'%02x'
更有效。做了一个改变/usr/bin/perl-binmode(STDIN);while()随着代码更改为binmod+removing chomp,流正在中断验证chomp正在从编码流中删除0a,但是我需要在每个十六进制集合中插入以下字符“\x”,例如0d0d0a24将是\x0d\x0d\x0a\x24。如有任何建议,将不胜感激。
#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