Linuxでシステム設定やプログラムを触っていると、IPアドレスやファイルのパーミッション、デバイスIDなどが16進数(hex)で表示されることがよくあります。
「この16進数、10進数だといくつなんだろう?」
逆に「10進数を16進数にしたい」という場面も多いですよね。
この記事では、Linuxで16進数と10進数を相互に変換する方法を、printf
・echo
・bc
コマンドを使ってわかりやすく解説します。
16進数と10進数について知っておこう

16進数が使われる場面
Linuxでは以下のような場面で16進数がよく使われます:
- ファイルのパーミッション:
chmod 755
の代わりにchmod 0x2ED
- IPアドレスの内部表現:
192.168.1.1
が0xC0A80101
- プロセスID:
ps
コマンドの出力で16進数表示 - メモリアドレス:デバッグ時のアドレス情報
- カラーコード:
#FF0000
(赤色)など
基本的な対応関係
10進数 | 16進数 | よく見る例 |
---|---|---|
0 | 0 | 空の状態 |
10 | A | デバイス番号 |
15 | F | 最大値(4bit) |
16 | 10 | 1バイト区切り |
255 | FF | 1バイトの最大値 |
256 | 100 | 256色パレット |
これらの変換方法を覚えれば、Linuxでの作業がぐっと楽になります。
16進数 → 10進数に変換
printfを使う方法(おすすめ)
printf
はシェル組み込みの強力なフォーマットコマンドです。
基本的な使い方
0xffを10進数に変換
printf "%d\n" 0xff
結果
255
これだけで簡単に変換できます。
よく使う16進数の変換例
ファイルパーミッション
printf "%d\n" 0x1ff # 511 (rwxrwxrwx)
printf "%d\n" 0x1ed # 493 (rwxr-xr-x)
IPアドレス
printf "%d\n" 0xc0a80101 # 3232235777 (192.168.1.1)
カラーコード
printf "%d\n" 0xff0000 # 16711680 (赤色)
echo $(( ))で計算
bashの算術展開を使っても可能です。
16#記法を使う
echo $((16#ff))
結果
255
より実用的な例
複数の値を一度に変換
for hex in ff 100 1ff; do
echo "0x$hex = $((16#$hex))"
done
結果
0xff = 255
0x100 = 256
0x1ff = 511
実際の使用場面
ログファイルの16進数を読み解く
システムログによく出てくる16進数を変換:
# カーネルメッセージの例
echo "Error code 0x$(printf "%d\n" 0x80004005)"
ネットワーク設定の確認
# ルーティングテーブルの値を変換
printf "Gateway: %d.%d.%d.%d\n" \
$((16#c0)) $((16#a8)) $((16#01)) $((16#01))
これで16進数を10進数にすぐ変換できます。次は逆に、10進数を16進数に変換する方法を見てみましょう。
10進数 → 16進数に変換
printfで変換(基本)
小文字の16進数
printf "%x\n" 255
結果
ff
大文字の16進数
printf "%X\n" 255
結果
FF
実用的な変換例
ファイルパーミッションを16進数で表示
# 755 (rwxr-xr-x) を16進数に
printf "0x%x\n" 755 # 0x2f3
# 644 (rw-r--r--) を16進数に
printf "0x%x\n" 644 # 0x284
IPアドレスを16進数に変換
# 192.168.1.1 を16進数に
printf "0x%02X%02X%02X%02X\n" 192 168 1 1
結果
0xC0A80101
プレフィックス付きで表示
0xプレフィックス付き
printf "0x%x\n" 255 # 0xff
printf "0x%X\n" 255 # 0xFF
桁数を揃える
printf "0x%04x\n" 255 # 0x00ff(4桁)
printf "0x%08X\n" 255 # 0x000000FF(8桁)
bcを使った柔軟な相互変換

bcコマンドの基本
bc
(任意精度計算ツール)を使うと、複雑な変換や大きな数値も扱えます。
10進数 → 16進数
echo "obase=16; 255" | bc
結果
FF
16進数 → 10進数
echo "ibase=16; FF" | bc
結果
255
複雑な計算での活用
大きな数値の変換
# 大きな10進数を16進数に
echo "obase=16; 1234567890" | bc # 499602D2
# 大きな16進数を10進数に
echo "ibase=16; 499602D2" | bc # 1234567890
複数の基数変換
# 16進数を2進数に
echo "ibase=16; obase=2; FF" | bc # 11111111
# 8進数を16進数に
echo "ibase=8; obase=16; 777" | bc # 1FF
実用的なbcの使い方
計算結果を直接変換
# 計算結果を16進数で表示
echo "obase=16; 100 + 155" | bc # FF
# 16進数同士の計算
echo "ibase=16; FF + 1" | bc # 100(16進数として)
ファイルサイズの計算
# バイト数をKB、MB表記に
echo "scale=2; 1048576 / 1024 / 1024" | bc # 1.00 MB
より実用的な活用例
スクリプトでの自動変換
関数として定義
# .bashrcに追加すると便利
hex2dec() {
printf "%d\n" "0x$1"
}
dec2hex() {
printf "%x\n" "$1"
}
# 使用例
hex2dec ff # 255
dec2hex 255 # ff
対話的な変換ツール
#!/bin/bash
# convert.sh - 進数変換ツール
echo "進数変換ツール"
echo "1) 16進数 → 10進数"
echo "2) 10進数 → 16進数"
read -p "選択してください (1/2): " choice
case $choice in
1)
read -p "16進数を入力 (0xなしで): " hex
printf "10進数: %d\n" "0x$hex"
;;
2)
read -p "10進数を入力: " dec
printf "16進数: 0x%x\n" "$dec"
;;
*)
echo "無効な選択です"
;;
esac
システム管理での活用
プロセスIDの変換
# hexdumpの出力を読みやすく
hexdump -C /dev/urandom | head -5 | while read line; do
# 各バイトを10進数で表示
echo "$line" | sed 's/|.*//g' | tr ' ' '\n' | while read hex; do
if [[ "$hex" =~ ^[0-9a-f]{2}$ ]]; then
printf "%s=%d " "$hex" "0x$hex"
fi
done
echo
done
ネットワーク設定の確認
# ルーティングテーブルの16進数を変換
ip route | grep default | while read line; do
gateway=$(echo "$line" | awk '{print $3}')
echo "Gateway: $gateway"
# IPアドレス各オクテットを16進数で表示
IFS='.' read -ra ADDR <<< "$gateway"
printf "Hex: "
for i in "${ADDR[@]}"; do
printf "%02X " "$i"
done
echo
done
よくある使用場面と対処法

デバッグ時の活用
メモリアドレスの計算
# ベースアドレス + オフセット
base_addr=0x1000
offset=0x100
printf "結果アドレス: 0x%x\n" $((base_addr + offset)) # 0x1100
エラーコードの解析
# Windowsエラーコードを分析
error_code=0x80004005
printf "Error: %d (0x%X)\n" $error_code $error_code
設定ファイルでの活用
ファイル権限の設定
# 数値モードを16進数で確認
mode=755
printf "chmod %d (0x%x)\n" $mode $mode
# パーミッションビットの詳細
printf "User: %d, Group: %d, Other: %d\n" \
$((mode / 100)) $(((mode / 10) % 10)) $((mode % 10))
トラブルシューティング
よくあるエラーと対処
無効な16進数
# エラー例:0xや#が含まれている場合
printf "%d\n" "0x#ff" # エラー
# 正しい書き方
printf "%d\n" "0xff" # OK
大きすぎる数値
# bashの制限を超える場合はbcを使用
echo "ibase=16; FFFFFFFFFFFFFFFF" | bc
まとめ
Linuxで16進数と10進数を相互に変換するには、用途に応じて以下の方法を使い分けましょう:
簡単な変換
- printf “%d\n” 0xff:16進数→10進数
- printf “%x\n” 255:10進数→16進数
- echo $((16#ff)):bashの算術展開
複雑な変換・計算
- echo “ibase=16; obase=10; FF” | bc:基数指定変換
- echo “obase=16; 255” | bc:大きな数値対応
実用的なポイント
- ファイルパーミッションの理解に活用
- IPアドレスやネットワーク設定の分析
- デバッグ時のメモリアドレス計算
- システムログの16進数値の解読
これらを知っておけば、IPヘッダやファイルモード、デバイス管理などで出てくる16進数表記も怖くありません。ぜひ日常の管理作業に役立ててください。
コメント