如何使用Perl单行解码以十六进制编码的ASCII字符串?

时间:2010-02-18 08:20:05

标签: perl

我想写一个Perl单行来解码一行编码为十六进制数字的ASCII字符(例如,行48 54 54 50应解码为HTTP)。我想出了这个:

perl -nE 'say map(chr, map { qq/0x$_/ } split)'

打印一个空行。我做错了什么,你会怎么写呢?

4 个答案:

答案 0 :(得分:6)

这有效:

echo '48 54 54 50' | perl -nE 'say map{chr(hex)} split'

我假设您要从STDIN提供数据。

答案 1 :(得分:6)

这是你的qq/0x$_/伎俩不起作用。 chr期望一个数字作为参数,但得到字符串文字"0x48"。使用hex功能将48转换为十进制数,例如datageist中的his answer

这对我有用:

echo '48 54 54 50' | perl -nE 'say map(chr, map { hex } split)'

答案 2 :(得分:6)

与Perl TIMTOWTDI一样。

我想我会提交几个选项,并展示如果正常书写的话会是什么样子。如果您想了解有关命令行选项的更多信息,perldoc perlrun是一个有用的资源。


这些都输出相同的东西。除了其中一些不会在最后打印换行符。

echo '48 54 54 50' | perl -0x20 -pe'$_=chr hex$_'
echo '48 54 54 50' | perl -0x20 -ne'print chr hex$_'
echo '48 54 54 50' | perl -0777 -anE'say map chr,map hex,@F'
echo '48 54 54 50' | perl -0777 -anE'say map{chr hex$_}@F'
echo '48 54 54 50' | perl -0apple'$_=chr hex$_' -0x20
echo '48 54 54 50' | perl -apple'$_=join"",map{chr hex}@F'
echo '48 54 54 50' | perl -lanE'say map{chr hex}@F'

以下是一些示例如果正常写的话会是什么样子。如果你想弄清楚其他人做了什么,一定要看perldoc perlrun


perl -0x20 -pe'$_=chr hex$_'

这是一个相当直接的。它可能是这里最好的例子,也是最短的例子。它假装空格用于分隔线条,因此在循环内部只有一个字母可以处理。

# perl -0x20 -pe'$_=chr hex$_'
$/ = " ";  # -0 ( input separator )
while( <> ){
  $_ = chr hex $_;
} continue {
  print $_;
}

perl -0apple'$_=chr hex$_' -0x20

这个有一些命令行选项,它们没有做任何有用的事情。

  • 第一个-0选项存在,以便-l将输出分隔符设置为空字符串。 这实际上是输出分隔符的默认值。
  • 有两个-p选项,其中一个就足够了。
  • -a选项会设置@F数组,但我们实际上并未使用它。

基本上我使用-a -l和第二个-p,以便选项拼写 apple 。否则这个与最后一个例子相同。

echo '48 54 54 50' | perl -0x20 -pe'$_=chr hex$_'
# perl -0apple'$_=chr hex$_' -0x20
$/ = "";  # -0 ( input separator )
$\ = $/;  # -l ( output separator )
$/ = " "; # -0x20 ( input separator )
while( <> ){
  @F = split " ", $_; # -a ( unused )
  $_ = chr hex $_;
} continue {
  print $_;
}

perl -lanE'say map{chr hex}@F'

我认为我已拼写 apple ,我不妨拼写 lanE

  • -l并没有用,因为我们已经在使用say
  • 使用-E代替-e,以便我们可以使用say
# perl -lanE'say map{chr hex}@F'
$\ = $/; # -l ( output separator set to "\n" )
while( <> ){
  @F = split " ", $_; # -a
  say map { chr hex $_ } @F;
}

答案 3 :(得分:3)

玩perlgolf?

-ple y/0-9A-Fa-f//cd;$_=pack"H*",$_
-ple $_=pack"H*",$_,join"",split
-nE say map chr hex,split
-naE say map chr hex,@F