使い方
- テキストを8進数に変換するには「エンコード」を、8進数の値をテキストに戻すには「デコード」を選択します。
- テキストや8進数を入力または貼り付けます。ファイルを開いて、そのバイト列を変換することもできます。
- 出力の「区切り文字」を「スペース」「なし」「カンマ」「改行」から選びます。
- 結果をコピーするか、ファイルとしてダウンロードします。
8進数とは
8進数(Base8)は、0~7 の数字で数値を表す記数法です。8進数の 1 桁はちょうど 3 ビットに相当するため、12 ビットの PDP-8 や 36 ビットの PDP-10 のように、ワード長が 3 の倍数だった初期のコンピューターで広く使われました。現在では、主にエスケープシーケンスや Unix のファイルパーミッションで使われています。
1 バイトは 0~255 の値を持ち、これは8進数で 0~377 になります。このツールは入力のすべてのバイトを、先頭のゼロを含めて必ず 3 桁の8進数で書き出します。そのため、どのグループも同じ幅になり、区切り文字なしでつなげても元に戻せます。テキストはまず、選択した文字コードでバイト列に変換されます。ASCII の文字は 1 文字 1 バイト、UTF-8 のそれ以外の文字は 1 文字 2~4 バイトです。
8進数のエスケープシーケンス
C、C++、Python、Perl、シェルの printf では、バックスラッシュに続けて最大 3 桁の8進数を書くことで 1 バイトを表せます。\101 は文字 A、\012 は改行(LF)です。
このツールは、バックスラッシュを付けずに数字だけを出力します。エスケープした文字列を作るには、スペース区切りの出力の各スペースをバックスラッシュに置き換え、最初のグループの前にもバックスラッシュを 1 つ付けます。エスケープシーケンスをデコードするには、逆にバックスラッシュをスペースに置き換えてください。デコーダーが受け付けるのは数字と区切り文字だけです。
755 のようなファイルパーミッションも8進数ですが、これはテキストではなく数値です。このような数値を2進数や10進数に変換するには、基数変換ツールを使用してください。
コードで8進数を扱う
# Python
' '.join(f'{b:03o}' for b in 'Hi'.encode()) # '110 151'
bytes(int(o, 8) for o in '110 151'.split()).decode() # 'Hi'
# Shell
printf '\110\151\n' # Hi と出力
printf 'Hi' | od -An -to1 # 110 151
仕様
| 使用文字 | 0-7 |
|---|---|
| 出力サイズ | 1 バイトあたり 3 桁(300%) |
| パディング | なし |
| 規格 | 8進数の位取り表記 |
| 大文字と小文字の区別 | なし |
エンコード例
| 入力 (UTF-8) | 出力 |
|---|---|
Hello, World! | 110 145 154 154 157 054 040 127 157 162 154 144 041 |
Base64.is | 102 141 163 145 066 064 056 151 163 |
你好 | 344 275 240 345 245 275 |
よくある質問
どのバイトも8進数 3 桁になるのはなぜですか?
最大のバイト値 255 は8進数で 377 なので、3 桁あれば必ず足ります。小さい値も先頭をゼロで埋めてすべてのグループを同じ幅にしているため、区切り文字のない文字列でもバイトに分割し直せます。
スペースのない8進数をデコードするにはどうすればよいですか?
数字をひと続きの文字列として貼り付けてください。デコーダーは 3 桁ずつに分割するため、長さが 3 の倍数である必要があります。3 桁に満たない値がある場合は、スペース、カンマ、改行で区切ってください。
400 のような値がエラーになるのはなぜですか?
8進数の 400 は 256 で、1 バイトに収まりません。有効なバイト値は 0~377 で、この範囲外のグループがあると、デコーダーはその位置を表示します。また、数字の 8 と 9 はそもそも8進数の数字として使えません。
別の文字コードで8進数の値を得ることはできますか?
はい。「文字コード」メニューで選択してください。たとえば日本語なら Shift_JIS や EUC-JP、中国語なら GBK を選べます。Windows-1252 や ISO-8859-1 では、西ヨーロッパの文字が 1 文字 1 バイトになります。