如何在Perl中输出二进制文件?

4

我希望能输出0x41,并且将其显示为A

目前为止,我尝试过以下方法:

my $out;
open $out, ">file.txt" or die $!;
binmode $out;
print $out 0x41;
close $out;

在生成的文件中,它输出65而不是A。这不是我想要的。

我也阅读了这个类似的问题,但我不会直接转移答案。使用pack将短结果打包为2字节而不是1字节。


我认为print的perldoc中最重要的提示是:打印一个字符串或一组字符串,而不是数字。这就是为什么文件句柄的二进制模式(尽管对于二进制数据是必需的!)在二进制解释方面是一个误导。我也曾经掉入过这个陷阱。 - MattTT
3个回答

3

你可以使用chr(0x41)

对于较大的结构,你可以使用pack

pack('c3', 0x41, 0x42, 0x43) # gives "ABC"

关于你对 pack 的怀疑,请去阅读它的页面 - 它非常通用。 'c' 会打包一个字节,'s'(就像那个问题中看到的)会打包一个两个字节的单词。

1
据我所知,chr 可以适用于任何字节值(0-255)。它与 Unicode 有更复杂的关系。不过,pack 是相当可靠的,因为你可以根据需要定制模板。 - Amadan
请考虑使用 pack('C', ...)。否则对于大于0x7f的值会出现警告“Character in 'c' format wrapped in pack”(尽管输出是正确的)。 - MattTT

1

pack需要两个参数:第一个参数解释了需要打包的数据的方式和数量:

perl -e 'printf "|%s|\n",pack("c",0x41,0x42,0x44);'
|A|

perl -e 'printf "|%s|\n",pack("c3",0x41,0x42,0x44);'
|ABD|

perl -e 'my @bytes=(0x41,0x42,0x43,0x48..0x54);
         printf "|%s|\n",pack("c".(1+$#bytes),@bytes);'
|ABCHIJKLMNOPQRST|

在第一部分中,您甚至可以混合格式:

perl -e 'printf "|%s|\n",pack("c3B8",0x41,0x42,0x44,"01000001");'
|ABDA|

1
使用chr函数:
print $out chr 0x41

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接