コマンドラインで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でも簡単にできることは理解しておいてもいいだろう。
この連載の記事
-
第432回
PC
ウェブブラウザが切り開いたWindowsでのタブアプリケーション -
第431回
PC
Windows上でユニコードを「見る」方法 -
第430回
PC
WindowsからWordPadが廃止! RTF(Rich Text Format)はどうなる? -
第429回
PC
Windows Updateの「利用可能になったらすぐに最新の更新プログラムを入手する」はオンにした方がいいか? -
第428回
PC
Google/Bingで使える検索オプション -
第427回
PC
WindowsのPowerShellのプロファイルを設定する -
第426回
PC
WindowsでAndroidスマホをWebカメラにする機能を試した -
第425回
PC
無料で使えるExcelにWord、Microsoft 365のウェブ版を調べた -
第424回
PC
Windowsの基本機能であるクリップボードについてあらためて整理 -
第423回
PC
PowerShellの今を見る 2つあるPowerShellはどっち使えばいい? -
第422回
PC
Windows 11の目玉機能が早くも終了、Windows Subsystem for Android(WSA)を振り返る - この連載の一覧へ