スプレッドシートのHEX2OCT関数|16進→8進とエラー対処

スポンサーリンク

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")37710進の255
F3=HEX2OCT("F",3)017先頭を0で埋める
FF10=HEX2OCT("FF",10)0000000377指定できる最大の10桁
199なし=HEX2OCT(199)631引用符なしでも同じ
81EDなし=HEX2OCT("81ED")100755権限値の例(後述)
1FFFFFFFなし=HEX2OCT("1FFFFFFF")3777777777正の最大
20000000なし=HEX2OCT("20000000")#NUM!正の範囲外
FFFFFFFFFFなし=HEX2OCT("FFFFFFFFFF")777777777710進の -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")+9386「377」を10進の377として足している
=B1+B3(377と631のセル)100810進として足し算している
=SUM(B1:B5)(結果5セル)0SUMは範囲のテキストを無視する
=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あり
FF377377
(空白)#VALUE!(空欄のまま)
81ED100755100755

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桁を取り出しましょう。

セル内容数式結果
A216進の値81ED—
B28進に変換=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() に入れて結果を確かめてみてください。

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