概要
小ネタ。よく忘れるのでメモメモ。
通信周りを作ったりテストしたりしてると、結構頻繁に16進数と2進数を変換したりする機会があります。
で、linuxで作業している場合は大抵はコマンドラインで作業しているので、コマンドラインで変換をしてしまいたいです。
進数変換する場合は、bc
コマンドを使うと便利です。以下のようにします。
$ echo "obase=出力の進数(2,8,10,16); ibase=入力の進数(2,8,10,16); 値" | bc
例えば、通信データをキャプチャしてて AA55
ってデータが表示されたので、これを2進数にしたい場合は
$ echo "obase=2; ibase=16; AA55" | bc
ってやると
1010101001010101
って出力されます。
んで、ビットで見たい場合って大抵1バイト単位で何らかのフラグフィールドがあったりするので、8ビット単位で出力が区切られている方が都合がいい場合があります。
そういうときは、先程の結果に fold
コマンドで折りたたみをしてもらうようにするとスッキリ見えます。
fold
コマンドは、GNU Coreutils に含まれているコマンドなので、大抵のLinuxにはデフォルトで入っています。
上記の結果に fold
コマンドでさらにパイプすると
$ echo "obase=2; ibase=16; AA55" | bc | fold -w 8 10101010 01010101
となります。
サンプル
#!/usr/bin/env bash # # REFERENCES: # - https://stackoverflow.com/questions/34159451/splitting-big-block-of-binary-into-8-bit-chunks-in-bash # - https://unix.stackexchange.com/questions/65280/binary-to-hexadecimal-and-decimal-in-a-shell-script # - https://unix.stackexchange.com/questions/464808/bc-why-does-ibase-16-obase-10-ff-returns-ff-and-not-255 # target=AAF00F55 echo "TARGET: ${target}" # bc コマンドを使って 16 進数を 2 進数に変換 echo '--------- with bc command ---------' echo "obase=2; ibase=16; ${target}" | bc # bc コマンドの結果を、さらに fold コマンドで 8桁 ずつで折りたたみ echo '--------- with bc command with fold command ---------' echo "obase=2; ibase=16; ${target}" | bc | fold -w 8
try-linux/hex_to_bin.sh at master · devlights/try-linux · GitHub
実行すると以下のようになります。
gitpod /workspace/try-linux $ make bash ./main.sh -o ENTER EXAMPLE NAME: hex_to_bin [INPUT ] hex_to_bin [TARGET] convert_hex_to_bin [SCRIPT] basic/convert/hex_to_bin.sh ===== START [basic/convert/hex_to_bin.sh] ===== TARGET: AAF00F55 --------- with bc command --------- 10101010111100000000111101010101 --------- with bc command with fold command --------- 10101010 11110000 00001111 01010101 ===== END [basic/convert/hex_to_bin.sh] =====
過去の記事については、以下のページからご参照下さい。
- いろいろ備忘録日記まとめ
サンプルコードは、以下の場所で公開しています。
- いろいろ備忘録日記サンプルソース置き場