Linuxで16進数と10進数を相互変換する方法|printf・echo・bcで簡単計算

Linux

Linuxでシステム設定やプログラムを触っていると、IPアドレスやファイルのパーミッション、デバイスIDなどが16進数(hex)で表示されることがよくあります。

「この16進数、10進数だといくつなんだろう?」

逆に「10進数を16進数にしたい」という場面も多いですよね。

この記事では、Linuxで16進数と10進数を相互に変換する方法を、printfechobcコマンドを使ってわかりやすく解説します。

スポンサーリンク

16進数と10進数について知っておこう

16進数が使われる場面

Linuxでは以下のような場面で16進数がよく使われます:

  • ファイルのパーミッションchmod 755 の代わりに chmod 0x2ED
  • IPアドレスの内部表現192.168.1.10xC0A80101
  • プロセスIDpsコマンドの出力で16進数表示
  • メモリアドレス:デバッグ時のアドレス情報
  • カラーコード#FF0000(赤色)など

基本的な対応関係

10進数16進数よく見る例
00空の状態
10Aデバイス番号
15F最大値(4bit)
16101バイト区切り
255FF1バイトの最大値
256100256色パレット

これらの変換方法を覚えれば、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進数表記も怖くありません。ぜひ日常の管理作業に役立ててください。

コメント

タイトルとURLをコピーしました