2017-02-15 116 views
1

在Linux中bash shell中,我使用以下方法來轉換一個普通的十六進制轉儲到二進制十六進制轉儲到二進制 - XXD -r相當於

$ echo "8cd59ef53c9aaa68311b73767e0975e7" | xxd -r -p > xxd_out.bin 

當我打開文本閱讀文件,它看起來像ŒÕžõ<šªh1sv~ uç

或XXD

$ xxd -b xxd_out.bin 
00000000: 10001100 11010101 10011110 11110101 00111100 10011010 ....<. 
00000006: 10101010 01101000 00110001 00011011 01110011 01110110 .h1.sv 
0000000c: 01111110 00001001 01110101 11100111     ~.u. 

或在記事本++十六進制編輯器(插件)視圖 enter image description here

如何在Ruby中獲得相同的二進制輸出?有什麼圖書館可以做什麼xxd -r -p會做什麼?

回答

3

使用Array#pack

.scan(/../)將分裂成"8cd59e"["8c","d5","9e"]

.map(&:hex)將其轉換爲[0x8c, 0xd5, 0x9e]

.pack("c*")將它打包到"\x8c\xd5\x9e"

echo "8cd59ef53c9aaa68311b73767e0975e7" | \ 
    ruby -ne 'print $_.scan(/../).map(&:hex).pack("c*")' | \ 
    xxd -b 

輸出:

00000000: 10001100 11010101 10011110 11110101 00111100 10011010 ....<. 
00000006: 10101010 01101000 00110001 00011011 01110011 01110110 .h1.sv 
0000000c: 01111110 00001001 01110101 11100111     ~.u. 
+0

或[my_hex_string] .pack('H *') – peter