以可读的十六进制格式而不是ASCII格式打印二进制缓冲区

时间:2014-07-23 19:13:22

标签: perl

我有一个二进制缓冲区$ data,它有一些十六进制数据,如果我打印它,我会得到这个:

$VAR1 = '☺, ?♥☻♦\' N v ►☻ ☻ ◄☻   ↕♥    ‼♥    ¶♥    §* ☺♥☺♥☺@☺ ☺☺☺♠☺♠☺ ☺♦ ☺♀         ☺☻ ☺3

这对我来说显然毫无意义。但如果我可以将其打印为:

,那将非常有用
8F 00 8F 13 D0 21 A5 25 A3 DA CA 00 01 82 00 80 03 02 04 27 00 4E 00 76 

代替。

我尝试使用sprintf("%x", $data),但这没有帮助。

有人可以帮助我吗?

谢谢!

2 个答案:

答案 0 :(得分:5)

如果您对格式不太挑剔,

sprintf("%v02X", $bytes)

会给你

8F.00.8F.13....

如果你真的想要

8F 00 8F 13 ...

然后以下是一些选项:

sprintf("%v02X", $bytes) =~ s/\./ /rg

join ' ', map { sprintf("%02X", ord($_)) } split(//, $bytes)

join ' ', unpack '(H2)*', $bytes

答案 1 :(得分:1)

使用ord功能:

$VAR1 = '☺, ?♥☻♦\' N v ►☻ ☻ ◄☻   ↕♥    ‼♥    ¶♥    §* ☺♥☺♥☺@☺ ☺☺☺♠☺♠☺ ☺♦ ☺♀         ☺☻ ☺3';

print join ' ', map {sprintf("%x", ord)} split //, $VAR1;

输出:

e2 98 ba 2c 20 3f e2 99 a5 e2 98 bb e2 99 a6 27 20 4e 20 76 20 e2 96 ba e2 98 bb 20 e2 98 bb 20 e2 97 84 e2 98 bb 20 20 20 e2 86 95 e2 99 a5 20 20 20 20 e2 80 bc e2 99 a5 20 20 20 20 c2 b6 e2 99 a5 20 20 20 20 c2 a7 2a 20 e2 98 ba e2 99 a5 e2 98 ba e2 99 a5 e2 98 ba 40 e2 98 ba 20 e2 98 ba e2 98 ba e2 98 ba e2 99 a0 e2 98 ba e2 99 a0 e2 98 ba 20 e2 98 ba e2 99 a6 20 e2 98 ba e2 99 80 20 20 20 20 20 20 20 20 20 e2 98 ba e2 98 bb 20 e2 98 ba 33

注意:如果您的数据是utf8,那么您需要将其指定为:

263a 2c 20 3f 2665 263b 2666 27 20 4e 20 76 20 25ba 263b 20 263b 20 25c4 263b 20 20 20 2195 2665 20 20 20 20 203c 2665 20 20 20 20 b6 2665 20 20 20 20 a7 2a 20 263a 2665 263a 2665 263a 40 263a 20 263a 263a 263a 2660 263a 2660 263a 20 263a 2666 20 263a 2640 20 20 20 20 20 20 20 20 20 263a 263b 20 263a 33