いろいろ備忘録日記

主に .NET とか Go とか Python絡みのメモを公開しています。

16進数を2進数に変換して8ビットずつ表示する (bash)

概要

小ネタ。よく忘れるのでメモメモ。

通信周りを作ったりテストしたりしてると、結構頻繁に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にはデフォルトで入っています。

linuxjm.osdn.jp

上記の結果に 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] =====

過去の記事については、以下のページからご参照下さい。

  • いろいろ備忘録日記まとめ

devlights.github.io

サンプルコードは、以下の場所で公開しています。

  • いろいろ備忘録日記サンプルソース置き場

github.com

github.com

github.com