コマンドラインで2進数、16進数を扱う
Windows PowerShell(Ver.5.1 以下、WPS)とPowerShell(Ver.7.2、以下、PS7)では16進数を扱うことができる。さらに、PS7では2進数も扱える。まずは、16進数を数値として入力するには前に16進数プリフィックス「0x」を付けて16進数を入力すればよい。この表記は、数値(Int32、符号付き)として解釈されるので、数値が必要な引数のどこにでも置くことができる。
コマンドラインに直接入力してEnterキーを押せば、10進数に変換された数値を表示できる。これで、簡易に16進数/2進数を10進数に変換できる。また、コマンドラインでそのまま四則演算やmathクラスの関数の引数にすることも可能だ。なお、PS7では、さらに2進数プリフィックス「0b」を使うことができる。
このほか、WPSやPS7では、数値の後ろに「KB」「MB」「GB」「TB」「PB」などの「乗数サフィックス」を加えることで、2のべき乗による乗数を付けられる。
「KB」は、1024倍(2の10乗倍)を示す。たとえば、「4KB」は4096bytesを表す。この乗数サフィックスは、2進数、16進数プリフィックスと同時に使うことができる。たとえば1KBのデータが0x23(=35)個あるなら「0x23KB」とすればよい。
また、WPS、PS7で数値を16進数、2進数で表現したい場合、ConvertクラスのToStringメソッドを使う。具体的には、
[Convert]::ToString(<数値>、<基数>)
とする。基数は、2、8、10、16のみに対応し、それ以外はエラーになる。また、数値が整数以外の場合には、整数に変換されてから基数変換がなされる。たとえば、「[convert]::ToString(1.45,16)」の答えは「1」になる。
16進数を扱う頻度が高いなら、
function hex($x) { [Convert]::ToString($x,16) }
などとして、関数を定義してしまったほうがいいかもしれない。
整数値の場合のみ、以下の書き方ができる。
(<整数リテラル>).ToString("X")
$x.ToString("X")
2つ目の例では、変数$xには整数が入っているときのみ変換でき、それ以外ではエラーになる。これは、数値の書式表示で16進数を表す「X」を使うもの。「X4」などととして4桁の16進数表示とさせることも可能だ。桁数を指定して16進数にしたいときに使うといいだろう。
WPSやPS7では、外部のコマンドから文字列として受け取った16進数や2進数を数値に変換したい場合もあるだろう。基本としては、前述とおなじ「[Convert]」クラスの変換メソッドを使い、
[Convert]::ToInt32(<文字列>,<基数>)
とすることで、<文字列>を<基数>に基づいて数値に変換する。ただし、<基数>には、2、8、10、16しか指定することができない。
また、文字列にすでに2進数、16進数プリフィックスがついた状態なら、
[int]"0x00FF"
[byte]"0b01010101"
として、文字列を数値に変換することができる(「0b」はPS7でのみ可能)。なお、このとき16進数を表す「プレフィックス」として「0x」以外に「#」と「&H」を使うことも可能。「#」は、アセンブラや一部のコマンドで使うことがあり、「&H」は、Microsoft系のBASICなどで使うプリフィックスだ。
[Convert]::ToStringメソッドを使うことで数値を2、8、10、16進数に変換できる。また、書式指定文字「X」を使った16進数変換も可能。文字列にプリフィックスが含まれている場合には、型アクセラレーターを使って直接変化することもできる
先頭の「[int]」や「[byte]」は、PowerShellでは型アクセラレーターと呼ばれるもので、プログラミング言語でいう「キャスト」に相当するもの。PowerShellでは整数に関しては、以下の表のような型アクセラレーターとConvertクラスの変換メソッドを利用できる。
そのほか、さまざまなデータ形式に対して型アクセラレーターがある。これに関しては、マイクロソフトのページ(「型アクセラレータについて」)に記載がある。
ただし、日本語ページでは、本来英文表記である型アクセラレーターの一部が日本語になってしまっている。ページ下にある言語を英語に切り替えれば正しく表示される。
2進数では符号拡張に注意
PS7で2進数プリフィックスを使って2進数を表現する場合、符号拡張に注意する必要がある。符号拡張とは、型を変換するときに最上位ビットを符号ビットとして変換をすることだ。符号を表す最上位ビットが1であるとすると、変換後も最上位ビットが1になるように変換される。
たとえば、10進数の255を2進数で表現すると「1111 1111」となるが、そのまま2進数プリフィックスを付けて「0b11111111」とすれば、最上位ビットが1であるとして符号付きInt32に変換される。このため結果は、-1になってしまう。これを防ぐには最上位ビットが0であることを指定して「0b011111111」とする。
PS7で2進数を扱う場合、最上位ビットにより符号の有無が決まる。同じビットパターンでも最上位が0か1かで数値が異なる。型アクセラレーターを使った文字列からの変換でも、型に合致せずエラーになることがある
2進数文字列と型アクセラレーターを組み合わせる場合、2進数文字列は、型に合致したパターンのみ許される。型アクセラレーター「[byte]」(符号なし8bit整数値)を使うとき、符号なし2進数として、0~255の範囲となっている必要がある。このときに255を指定するには「0b011111111」とする。「0b11111111」では-1になるためエラーとなる。
なお、ConvertクラスのToInt32などの変換メソッドを使って文字列を数値に変換する場合には、こうした問題は起こらない。
コンピュータを使っていると、2進数や16進数はいつかは扱わねばならなくなる。10進数への簡単な変換や計算は、Windowsでも簡単にできることは理解しておいてもいいだろう。

この連載の記事
-
第508回
PC
Scalable Vector Graphics(SVG)そもそも何なのか? -
第507回
PC
Windows 11の「開発者モード」とは何か? -
第506回
PC
Windows 11は早くも来秋登場の26H2プレビューの準備が始まる -
第505回
PC
結構変化しているWindows 11のエクスプローラーの基本設定を見直す -
第504回
PC
新しいOutlookとOutlook Classic、そろそろ古いOutlookとExchangeの組み合わせは引退の頃合いか -
第503回
PC
機能が増えたこともあり、寄せ集めから統合化に進むWindowsの便利ツール「PowerToys」 -
第502回
PC
Windows 11でBluetoothのオーディオ新規格「Bluetooth LE Audio」を試す -
第501回
PC
Windows 11 Ver.25H2での変更点、新機能を整理する -
第500回
PC
Windows 11 Ver.25H2が完成した -
第499回
PC
Windowsでの致命的だが回復可能なエラーに備える手段を2つ紹介 -
第498回
PC
Windows Terminalの安定版V1.23が公開 設定UIが改良される - この連載の一覧へ














