2014-07-23 33 views
1

我有有一些十六進制數據,如果我打印出來,我會得到這個二進制緩衝區$數據:打印在可讀HEX格式,而不是ASCII格式的二進制緩存

$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),但這沒有幫助。

有人可以幫助我嗎?

謝謝!

回答

4

如果你不是在格式過於挑剔,

sprintf("%v02X", $data) 

會給你

8F.00.8F.13.... 

如果你真的想

8F 00 8F 13 ... 

然後,你需要的格式每次打開一個字節。

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

你也可以使用

join ' ', unpack '(H2)*', $data 
+2

或者:'print「$ _」for unpack(「(H2)*」,$ VAR1);'? – jm666

+0

@ jm666,謝謝! – ikegami

+0

啊。非常感謝!!! – YouHaveaBigEgo

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 
+0

這是無可厚非的。 '263a'不是一個字節 – ikegami

+0

OP的目標是「有幫助」的格式。用實際值列出的utf8字符很有幫助。 – Miller

+0

什麼UTF-8 Unicode字符?他沒有提及任何關於*二進制緩衝區*的UTF-8,這是不太可能的。這看起來像文字給你嗎? 8F 00 8F 13甚至不是有效的UTF-8! – ikegami