読者です 読者をやめる 読者になる 読者になる

Erlang Binary Pretty Printer を使おう

erlang

Erlang のバイナリ表記は十進数です、個人的には見やすいのですが、長くなると何が書いてあるのかわかりにくかったりします。

特にテストの時エラー時やデバッグ時はかなり読みにくいなと感じていました。

それを解決する素敵なツールが。 binpp です。

https://github.com/jtendo/binpp

さっそく使ってみましょう。

まずは基本のバイナリプリティプリント

> binpp:pprint(<<0:128>>).      
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
> binpp:pprint(crypto:rand_bytes(128)).
45 31 63 FF 39 03 D9 51 F6 E7 6D 1A A0 D1 BC C2  E1c&#255;9.&#217;Q&#246;&#231;m.&#160;&#209;&#188;&#194;
CA BE 27 27 F2 A6 B2 7B DB 41 35 06 7C 77 4E 20  &#202;&#190;''&#242;&#166;&#178;{&#219;A5.|wN 
8B 89 12 C9 81 3E B6 91 DB 91 7D 98 73 8B 35 E9  &#139;&#137;.&#201;&#129;>¶&#145;&#219;&#145;}&#152;s&#139;5&#233;
DE F0 3F 16 FC 3E 61 10 A2 41 36 E4 03 AA 12 22  &#222;&#240;?.&#252;>a.¢A6&#228;.&#170;."
F5 BC 2D 43 B0 47 6D FC 3A DC 21 81 D3 92 A9 B6  &#245;&#188;-C°Gm&#252;:&#220;!&#129;&#211;&#146;&#169;¶
46 9D EF 2E C4 42 FF A9 A9 69 2F 15 71 5F B1 25  F&#157;&#239;.&#196;B&#255;&#169;&#169;i/.q_±%
C1 33 80 F1 AE E3 4B BB A1 E4 88 AA 18 6D 90 5E  &#193;3&#128;&#241;&#174;&#227;K&#187;&#161;&#228;&#136;&#170;.m&#144;^
B9 FA 42 F3 F1 90 94 0D 05 0F FB E4 D2 25 05 71  &#185;&#250;B&#243;&#241;&#144;&#148;...&#251;&#228;&#210;%.q

感動ですね、とても見やすいです。

コンバート機能も持ってます。2 進数で表示したり 16 進数で表示したり

> binpp:convert(crypto:rand_bytes(128), bin).
{ok,["10111001","00010001","00111101","10001111","11000100",
     "10100010","01000010","01100000","01110011","10100010",
     "00011100","10010101","01100011","10000101","11001011",
     "00110000","00111100","10001011","11101100","10000001",
     "00001110","00000011","10011011","00110101","01111011",
     "10110010",
     [...]|...]}
> binpp:convert(crypto:rand_bytes(128), hex).
{ok,["E3","A5","DA","7A","B8","B3","1D","7C","C7","1D","DA",
     "B2","A9","65","61","DB","E1","2E","3B","62","93","B1","14",
     "1A","4C","A4",
     [...]|...]}

100 バイト目から 10 バイトを表示とかも出来ます。

> binpp:pprint(crypto:rand_bytes(128), 100, 10).
6F 22 BC 86 9E 29 F3 38 4A 27                    o"&#188;&#134;&#158;)&#243;8J'

は文字列から変換もあります

> binpp:from_str("6F 22 BC 86 9E 29 F3 38 4A 27").
<<111,34,188,134,158,41,243,56,74,39>>
> binpp:from_str("6F22BC869E29F3384A27").         
<<111,34,188,134,158,41,243,56,74,39>>

なんとバイナリ比較も

> binpp:cmprint(<<0:128>>, <<1:128>>).
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 00   -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 01 

> binpp:cmprint(<<1,2,1024:512,3,4>>, <<1,3,1024:512,5,6>>).
-- 02 -- -- -- -- -- -- -- -- -- -- -- -- -- --   -- 03 -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --   -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --   -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --   -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
-- -- 03 04                                       -- -- 05 06                              

よく使うツールの一つになりそうです。