コマンドラインで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などで使うプリフィックスだ。
先頭の「[int]」や「[byte]」は、PowerShellでは型アクセラレーターと呼ばれるもので、プログラミング言語でいう「キャスト」に相当するもの。PowerShellでは整数に関しては、以下の表のような型アクセラレーターとConvertクラスの変換メソッドを利用できる。
そのほか、さまざまなデータ形式に対して型アクセラレーターがある。これに関しては、マイクロソフトのページ(「型アクセラレータについて」)に記載がある。
ただし、日本語ページでは、本来英文表記である型アクセラレーターの一部が日本語になってしまっている。ページ下にある言語を英語に切り替えれば正しく表示される。
2進数では符号拡張に注意
PS7で2進数プリフィックスを使って2進数を表現する場合、符号拡張に注意する必要がある。符号拡張とは、型を変換するときに最上位ビットを符号ビットとして変換をすることだ。符号を表す最上位ビットが1であるとすると、変換後も最上位ビットが1になるように変換される。
たとえば、10進数の255を2進数で表現すると「1111 1111」となるが、そのまま2進数プリフィックスを付けて「0b11111111」とすれば、最上位ビットが1であるとして符号付きInt32に変換される。このため結果は、-1になってしまう。これを防ぐには最上位ビットが0であることを指定して「0b011111111」とする。
2進数文字列と型アクセラレーターを組み合わせる場合、2進数文字列は、型に合致したパターンのみ許される。型アクセラレーター「[byte]」(符号なし8bit整数値)を使うとき、符号なし2進数として、0~255の範囲となっている必要がある。このときに255を指定するには「0b011111111」とする。「0b11111111」では-1になるためエラーとなる。
なお、ConvertクラスのToInt32などの変換メソッドを使って文字列を数値に変換する場合には、こうした問題は起こらない。
コンピュータを使っていると、2進数や16進数はいつかは扱わねばならなくなる。10進数への簡単な変換や計算は、Windowsでも簡単にできることは理解しておいてもいいだろう。
この連載の記事
-
第457回
PC
IPv6アドレスは先頭を見ればどんな種類かわかる -
第456回
PC
あらためてIPv6基本のキ -
第455回
PC
Windowsで現在どのネットワークアダプタがインターネット接続に使われているかを調べる方法 -
第454回
PC
Windows 11 24H2では「デバイスの暗号化」の条件が変わり、より多くのPCでドライブが暗号化される -
第453回
PC
Windows 11 24H2の配布開始後もすぐにはやってこない Windows UpdateとSafeguard Holds -
第452回
PC
Windows 11 Ver.24H2が登場 Copilot+ PCとそうでないPCで実質Windowsが2つに分かれる -
第451回
PC
新しいWindowsサンドボックスではコマンドラインからの制御が可能に -
第450回
PC
ユニコードで文字数を数える方法 -
第449回
PC
WSLはプレビュー版でGUIでの設定が加わった! リリース2.3.xの新機能を見る -
第448回
PC
PowerShellで面倒なオブジェクトはPSCustomObjectに変換するのが早道 -
第447回
PC
この秋登場のWindows 11の新バージョン、Ver.24H2の状況を見る - この連載の一覧へ