Googleスプレッドシートで16進数を8進数に直すなら、HEX2OCT関数の出番です。書き方は =HEX2OCT(16進数, [有効桁])。たとえば =HEX2OCT("FF") と入れると「377」が返ります。
ただ、実際に使い始めると、次のようなところで手が止まりがちです。
- 有効桁を指定したら
#NUM!になった - 負の数を変換したら、10桁の長い値が返ってきた
- 変換した結果を SUM で合計したら 0 になった
どれも関数の仕様どおりの動きなので、理由がわかれば直すのは難しくありません。この記事では、スプレッドシートで実際に確かめた値をもとに、早見表・エラーの直し方・一覧の一括変換までまとめていきます。
スプレッドシートのHEX2OCT関数の書き方と結果の早見表
HEX2OCT(ヘックス・ツー・オクト)は、HEX(16進数)を OCT(8進数)に変える関数です。名前の「2」は to の意味。16進→2進のスプレッドシートのHEX2BIN関数とは兄弟の関係にあたります。
構文と2つの引数(数値・有効桁)
=HEX2OCT(符号付き16進数, [有効桁])
| 引数 | 必須/省略可 | 内容 |
|---|---|---|
| 符号付き16進数 | 必須 | 変換したい16進数。0〜9とA〜Fで最大10文字。セル参照も使える |
| 有効桁 | 省略可 | 結果の桁数(1〜10)。足りない分は先頭を0で埋める |
16進数は "FF" のように、引用符で囲んだ文字列で渡すのが基本です。英字の大文字・小文字は区別されず、"ff" でも377になります。
数字だけの16進数なら、引用符を付けなくても大丈夫。=HEX2OCT(199) と =HEX2OCT("199") は、どちらも631を返しました。A〜Fを含む値は文字列として渡す必要があるので、迷ったら引用符を付けておきましょう。
もう1つ覚えておきたいのが、返ってくる値は数値ではなくテキストだという点です。計算に使うときの注意は、エラーの章で詳しく説明します。
16進→8進の早見表(正の最大・負の数・範囲外まで)
スプレッドシートで確かめた結果を1つの表にまとめました。
| 入力 | 有効桁 | 数式 | 結果 | メモ |
|---|---|---|---|---|
| FF | なし | =HEX2OCT("FF") | 377 | 10進の255 |
| F | 3 | =HEX2OCT("F",3) | 017 | 先頭を0で埋める |
| FF | 10 | =HEX2OCT("FF",10) | 0000000377 | 指定できる最大の10桁 |
| 199 | なし | =HEX2OCT(199) | 631 | 引用符なしでも同じ |
| 81ED | なし | =HEX2OCT("81ED") | 100755 | 権限値の例(後述) |
| 1FFFFFFF | なし | =HEX2OCT("1FFFFFFF") | 3777777777 | 正の最大 |
| 20000000 | なし | =HEX2OCT("20000000") | #NUM! | 正の範囲外 |
| FFFFFFFFFF | なし | =HEX2OCT("FFFFFFFFFF") | 7777777777 | 10進の -1 |
| FFE0000000 | なし | =HEX2OCT("FFE0000000") | 4000000000 | 負の最小 |
| FFDFFFFFFF | なし | =HEX2OCT("FFDFFFFFFF") | #NUM! | 負の範囲外 |
変換できるのは、10進数でいうと -536,870,912〜536,870,911 の範囲です。8進数10桁に収まる範囲、と考えるとイメージしやすいはず。
入力が10文字以内でも、値が範囲を超えれば #NUM! になります。たとえば "7FFFFFFF" は8文字ですが、正の最大 1FFFFFFF を超えているためエラーでした。
有効桁(ゼロ埋め)と負の数のルール
HEX2OCTで迷いやすいのが、2つ目の引数「有効桁」と、負の数の扱いです。どちらもルールは決まっているので、一度押さえてしまえば怖くありません。
有効桁で桁数をそろえる(足りないと#NUM!)
有効桁を指定すると、結果がその桁数になるよう先頭に0を足してくれます。権限値の「3桁」のように、一覧の桁をそろえたいときに便利です。
=HEX2OCT("F",3) → 017
=HEX2OCT("FF",3) → 377
=HEX2OCT("FF",2) → #NUM!
=HEX2OCT("FF",4.9) → 0377
FFを8進数にすると377で、3桁が必要です。そこに有効桁2を指定すると、桁が足りずに #NUM! になります。有効桁は「最低これだけの桁にする」指定で、切り詰めはしないと覚えておきましょう。
有効桁に入れる値のルールは次のとおりです。
- 1〜10の整数を指定する
- 0・マイナスの値・11以上は
#NUM! - 4.9 のような小数は切り捨てて使われる(4.9は4桁)
"abc"のような文字列は#VALUE!
桁がばらばらの一覧なら、いちばん長い結果に合わせて有効桁を決めるのがコツ。迷ったら一度省略して変換し、最大の桁数を確かめてから指定すると失敗しません。
負の数は10桁で返る(有効桁は無視される)
HEX2OCTは、入力を40ビット(16進数10文字ぶん)の符号付きの数として読みます。先頭のビットが1の値、つまり 8000000000 以上の値が負の数です。
負の数は「2の補数」という表し方で、8進数10桁の形で返ってきます。2の補数とは、コンピュータが負の数を表すときの決まった書き方のこと。
=HEX2OCT("FFFFFFFFFF") → 7777777777(-1)
=HEX2OCT("FFE0000000") → 4000000000(-536,870,912)
=HEX2OCT("FFFFFFFFFF",4) → 7777777777(有効桁4は無視)
=HEX2OCT("FFFFFFFFFF",11) → #NUM!
負の数では有効桁が無視され、4を指定しても10桁のまま返りました。ただし有効桁11は、負の数でも #NUM! です。有効桁を指定するなら、負の数でも1〜10の範囲に収めておきましょう。
負の数として受け付けるのは FFE0000000〜FFFFFFFFFF の範囲だけです。"8000000000" も "FFDFFFFFFF" も、この範囲より小さいので #NUM! になりました。
もう1つの落とし穴が、10進の負数をそのまま入れるケース。=HEX2OCT(-1) は #NUM! になります。10進数を8進数に変えたいなら、スプレッドシートのDEC2OCT関数を使ってください。
HEX2OCTのエラー(#NUM!・#VALUE!)の原因と直し方
HEX2OCTのエラーは、ほとんどが #NUM! か #VALUE! のどちらかです。スプレッドシートで確かめたエラーの原因と、その直し方を早見表にまとめました。
| 原因 | 例 | 結果 | 直し方 |
|---|---|---|---|
| 正の最大(1FFFFFFF)を超えた | "20000000" | #NUM! | BASE+DECIMALで変換(FAQ参照) |
| 負の最小(FFE0000000)より小さい | "8000000000" | #NUM! | 入力値が正しいか確認する |
| 0〜9・A〜F以外の文字がある | "GG" | #NUM! | 入力ミスを直す |
| 前後に空白がある | " FF"・"FF " | #NUM! | TRIMで空白を除く |
| 11文字以上ある | "000000000FF" | #NUM! | 先頭の0を削って10文字以内にする |
| 10進の負数を入れた | -1 | #NUM! | DEC2OCTを使う |
| 有効桁が足りない | ("FF",2) | #NUM! | 有効桁を増やすか省略する |
| 有効桁が0・マイナス・11 | ("FF",0) | #NUM! | 1〜10を指定する |
| 有効桁が文字列 | ("FF","abc") | #VALUE! | 数値を指定する |
| 空白のセルを参照した | HEX2OCT(Z99) | #VALUE! | IFで空欄を除く(後述) |
意外と多いのが、前後の空白です。ほかのシステムから貼り付けた値には、見えない空白が混じっていることがあります。その場合は =HEX2OCT(TRIM(A2)) のように、TRIMで空白を取ってから渡しましょう。
11文字の入力は、"000000000FF" のように値が小さくてもエラーになりました。文字数そのものに上限がある、というわけです。
結果はテキスト:SUMが0になるときはOCT2DECで10進に戻す
HEX2OCTの結果は、見た目が数字でもテキストです。=ISTEXT(HEX2OCT("FF")) は TRUE を返しました。計算に使うと、次のように思わぬ結果になります。
| 数式 | 結果 | 何が起きているか |
|---|---|---|
=HEX2OCT("FF")+9 | 386 | 「377」を10進の377として足している |
=B1+B3(377と631のセル) | 1008 | 10進として足し算している |
=SUM(B1:B5)(結果5セル) | 0 | SUMは範囲のテキストを無視する |
=SUM(HEX2OCT("FF")) | 0 | 直接渡しても0 |
=VALUE(HEX2OCT("FF")) | 377 | 数値にはなるが、値は10進の377 |
=OCT2DEC(HEX2OCT("FF")) | 255 | 正しく10進の255に戻る |
+ で足すと、テキストの「377」が数値に変わって計算されます。エラーが出ないぶん、気づきにくいのが厄介なところ。FFは10進の255なので、正しくは255+9=264(8進で410)です。
SUMのほうは、テキストを無視して0を返します。VALUEで数値にしても377という10進の数になるだけで、8進数として計算されるわけではありません。
計算に使うなら、スプレッドシートのOCT2DEC関数で10進に戻してから、が鉄則です。8進数の形で見せたいときは、計算後にDEC2OCTで戻します。
=OCT2DEC(B1)+9 → 264(10進で計算)
=DEC2OCT(OCT2DEC(B1)+9) → 410(8進に戻す)
一覧を合計したいときは、隣の列に =OCT2DEC(B1) を入れて10進に戻し、その列をSUMするのが確実です。
IFERRORでエラーを空白にする
一覧の中にエラーが混じると、表が見づらくなりますよね。表示を整えたいなら、IFERRORで包むのが手軽です。
=IFERROR(HEX2OCT(A2),"")
=IFERROR(HEX2OCT(A2),"要確認")
ただしIFERRORは、入力ミスによるエラーも区別せずに隠してしまいます。空白にすると間違いに気づけないので、「要確認」のような目印を出す書き方がおすすめ。
空欄のセルによる #VALUE! だけを消したいなら、次の章で紹介するIFを使う方法が向いています。
一覧をまとめて変換する(ARRAYFORMULA・権限値)
16進数の値が何十行も並んでいるなら、1つの数式で列ごと変換すると楽です。ここでは、空白行への対策と、実務でよくある権限値の変換を紹介します。
ARRAYFORMULAで列ごと変換する(空白行を#VALUE!にしない)
A列の16進数をまとめて変換するなら、B2に次の数式を1つ入れるだけです。
=ARRAYFORMULA(IF(A2:A="","",HEX2OCT(A2:A)))
IFなしの =ARRAYFORMULA(HEX2OCT(A2:A)) では、空白の行が #VALUE! になります。両方の書き方で確かめた結果がこちら。
| A列の値 | IFなし | IFあり |
|---|---|---|
| FF | 377 | 377 |
| (空白) | #VALUE! | (空欄のまま) |
| 81ED | 100755 | 100755 |
IFを付けておくと、空白の行は空欄のまま残ります。あとから行を追加しても、自動で変換されるのがうれしいポイントです。
ちなみに、空文字 "" を直接渡した =HEX2OCT("") は「0」を返しました。A列が数式で "" を返している場合、IFがないと空欄が「0」に化けるおそれがあります。この点でも、IF(A2:A="","",…) の形にしておくと安心です。
16進の権限値(81ED)を755形式に直す
LinuxやmacOSのファイル情報では、権限が16進数で記録されていることがあります。たとえば 81ED という値。これをHEX2OCTで8進数にすると 100755 になります。
後ろの3桁「755」が、chmod 755 でおなじみの権限の部分です。先頭の「100」はファイルの種類(通常のファイル)を表しています。権限だけ欲しいなら、RIGHTで後ろ3桁を取り出しましょう。
| セル | 内容 | 数式 | 結果 |
|---|---|---|---|
| A2 | 16進の値 | 81ED | — |
| B2 | 8進に変換 | =HEX2OCT(A2) | 100755 |
| C2 | 権限の3桁 | =RIGHT(B2,3) | 755 |
一覧をまとめて処理するなら、ARRAYFORMULAとつなげて1つの数式にできます。
=ARRAYFORMULA(IF(A2:A="","",RIGHT(HEX2OCT(A2:A),3)))
RIGHTの結果もテキストです。「755」と一致するかを調べるときは、=C2="755" のように比べる側も文字列で書くと型がそろいます。
HEX2OCT関数のよくある質問
最後に、HEX2OCTを使うときによく出る疑問を見ていきましょう。
「0x」付きの16進数は変換できる?
変換できます。スプレッドシートでは =HEX2OCT("0xFF") が、"FF" と同じ377を返しました。プログラムのログなどに出てくる「0x」付きの値も、そのまま参照して大丈夫です。
ただし、前後に空白が入っていると #NUM! になります。また、長い値で「0x」の2文字が文字数の上限にかかるかは確かめていません。気になる場合は、SUBSTITUTE(A2,"0x","") で外してから渡すと確実でしょう。
1FFFFFFFを超える値を8進数にするには?
HEX2OCTでは扱えないので、DECIMALで10進に直し、BASEで8進にする方法を使います。
=BASE(DECIMAL("20000000",16),8) → 4000000000
=BASE(DECIMAL("FFFFFFFFFFF",16),8) → 377777777777777
11文字の「FFFFFFFFFFF」も、この方法なら変換できました。ただし、値は正の数として扱われます。
上の「4000000000」は、HEX2OCTで FFE0000000 を変換した結果と同じ見た目。でも、こちらは正の536,870,912を表しているので混同に注意してください。
詳しい使い方はスプレッドシートのBASE関数とスプレッドシートのDECIMAL関数で解説しています。
8進数を16進数に戻すには?
逆向きの変換には、OCT2HEX関数を使います。引数の考え方はHEX2OCTとよく似ているので、すぐに使えるはずです。書き方と注意点はスプレッドシートのOCT2HEX関数にまとめています。
ExcelのHEX2OCTと結果は同じ?
この記事の早見表やエラーの値は、Googleスプレッドシートで確かめたものです。Excelでは試していないため、「0x」付きの値・空白セル・前後の空白などの扱いが同じだとは言い切れません。
Excelで使う場合は、ExcelのHEX2OCT関数の使い方を参考にしてください。ファイルをやり取りするなら、相手の環境でも一度結果を確かめておくと安心です。
まとめ
スプレッドシートのHEX2OCT関数のポイントを振り返ります。
=HEX2OCT("FF")は377。16進数は引用符で囲んで渡すのが基本- 正の最大は 1FFFFFFF、負の最小は FFE0000000。超えると
#NUM! - 有効桁は1〜10。結果の桁が足りないと
#NUM!、小数は切り捨て - 負の数は8進数10桁で返り、有効桁は無視される
- 前後の空白・11文字以上・空白セルの参照はエラーになる
- 結果はテキストなので、計算するならOCT2DECで10進に戻す
進数の変換は、変換の向きごとに関数が分かれています。目的に合わせて、次の表から選んでみてください。
| やりたい変換 | 使う関数 | 解説記事 |
|---|---|---|
| 16進→8進 | HEX2OCT | この記事 |
| 8進→16進 | OCT2HEX | スプレッドシートのOCT2HEX関数 |
| 16進→10進 | HEX2DEC | スプレッドシートのHEX2DEC関数 |
| 10進→8進 | DEC2OCT | スプレッドシートのDEC2OCT関数 |
| 8進→10進(計算に使う) | OCT2DEC | スプレッドシートのOCT2DEC関数 |
| 8進→2進 | OCT2BIN | スプレッドシートのOCT2BIN関数 |
| 16進→2進 | HEX2BIN | スプレッドシートのHEX2BIN関数 |
| 範囲外の大きな値 | BASE・DECIMAL | スプレッドシートのBASE関数 |
まずは手元の16進数を1つ、=HEX2OCT() に入れて結果を確かめてみてください。
