前回、気象庁のWebページから現在の東京都の気温を取得し、そのデータをGoogle Chartでレンダリングできる形に加工するPowerShellスクリプトを作成した。グラフはBase64にエンコードした状態であればデータが取り出せることはわかったので、今回はそのBase64のデータをデコードする処理方法を取り上げる。
→連載「PowerShell Core入門 - 基本コマンドの使い方」の過去回はこちらを参照。
Base64
歴史的に、メールはバイナリデータを直接送信することができなかった。このため、バイナリデータをメールで送信したい場合はメールで送信できる形式に変換する必要があった。こうした変換に使われる方式はいくつか存在しており、「Base64」という仕組みもその1つだ。
Base64では3バイトのバイナリデータを6ビットごとにASCII文字へ変換する。変換先文字は大文字「A~Z」、小文字「a~z」、数字「0~9」、プラス記号「+」、スラッシュ記号「/」の64個。データ末尾には端数を埋めるためにイコール記号「=」も使われる。3バイト(24ビット)を6ビットごとASCII文字へ変換するので、結果として4文字のASCII文字に変換されることになる。
こうした変換方式はいくつか存在しているのだが、Base64はそうした変換方式の中でも人気があるというか、メール以外のシーンでもしばしば使われている。今回のケースでいえばHTMLに画像データを組み込む目的で、PNG画像をBase64でエンコードしたデータが使われている。
なお、Base64に変換すると3バイトごとのブロックが4バイトになるわけなので、エンコード後のデータは代替元データの133%のサイズになる。データが増えてしまうので、変換する理由がない限りはあまり使ったりはしない。
PowerShellとBase64
Base64はよく使われるエンコード形式なので、MacやLinuxといったOSには変換用のコマンドが用意されていることが多い。
ではWindowsはどうかと言うと、Windowsにはそうしたコマンドは用意されていない。さらに、PowerShellにもそういったコマンドレットは用意されていない。しかし、当然ながらWindowsでもBase64は利用しているわけで、エンコード/デコード処理は.NETに機能として用意されている。APIを叩けば使える状態だ。
PowerShellのコマンドレットとしてBase64の機能は用意されていないわけだが、.NETに用意されているということはPowerShellでも使えるということを意味している。PowerShellが強力なのはここだ。.NETで使える機能は基本的にPowerShellからも利用できる。これはWindowsの機能のかなりの部分がPowerShellから利用できることを意味している。PowerShellがWindowsにおいて重要なスクリプトであるのには、こういった理由がある。
PowerShellからBase64エンコード/デコードを行う方法
Base64のエンコード処理とデコード処理については詳しく取り上げても仕方ないので、ここではその使い方だけを簡単に説明しておく。
まず、データをBase64でエンコードするには「[Convert]::ToBase64String()」を使用する。このメソッドにはバイト配列を指定するので、エンコードしたいデータを先にバイト配列に変換しておく必要がある。例えば、文字列をバイト配列に変換するなら「[Text.Encoding]::Default.GetBytes()」を使用する。この2つのメソッドを使えば文字列をBase64エンコードに変換することができる。簡単なサンプルは次の通りだ。
PS C:\Users\daichi> $bytes = [Text.Encoding]::Default.GetBytes('Welcome')
PS C:\Users\daichi> $base64 = [Convert]::ToBase64String($bytes)
PS C:\Users\daichi> $bytes
87
101
108
99
111
109
101
PS C:\Users\daichi> $base64
V2VsY29tZQ==
PS C:\Users\daichi>
今度は逆にBase64エンコードをデコードする方法を説明しよう。Base64文字列は「[Convert]::FromBase64String()」でデコードできる。返り値はバイト配列だ。これを、例えば文字列として扱いたい場合は、さらにこのデータを文字列に変換する必要がある。バイト配列を文字列に変換するには「[Text.Encoding]::Default.GetString()」などを使えばよい。簡単なサンプルは次のようになる。
PS C:\Users\daichi> $base64
V2VsY29tZQ==
PS C:\Users\daichi> $bytes = [Convert]::FromBase64String($base64)
PS C:\Users\daichi> $string = [Text.Encoding]::Default.GetString($bytes)
PS C:\Users\daichi> $bytes
87
101
108
99
111
109
101
PS C:\Users\daichi> $string
Welcome
PS C:\Users\daichi>
要するに、Base64のエンコードとデコード処理は「[Convert]::ToBase64String()」および「[Convert]::FromBase64String()」が本体処理で、後はバイト配列を状況に応じてほかのデータ型に変換して使うといった感じになる。
Base64をデコードしてPNG画像ファイルへ出力
それでは、前回取得したPNG画像のBase64文字列をデコードしてPNG画像ファイルとして出力する処理をPowerShellスクリプトで実装する。ここではその部分だけの処理をPowerShellスクリプトで書いてみる。次のようなPowerShellスクリプトを用意した(base64_to_png.ps1)。
#!/usr/bin/env pwsh
#========================================================================
# Base64エンコードされたPNG画像を画像データに戻す
#========================================================================
$base64="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"
$bytes = [Convert]::FromBase64String($base64)
[IO.File]::WriteAllBytes("graph.png", $bytes)
このbase64_to_png.ps1では、先ほどの説明に載っていない処理として次のようにバイトデータをファイルへ出力する処理を行っている。
[IO.File]::WriteAllBytes("graph.png", $bytes)
このPowerShellスクリプトを実行すると、ホームディレクトリ下にgraph.pngというファイルが生成される。graph.pngを開くと次のようなPNG画像になっていることがわかる。
これでグラフデータの取得からグラフのレンダリングおよびそれをPNG画像として保存するところまで基本的な処理は全て実装できたことになる。後は、PowerShellからMicrosoft Edgeを操作して一連の操作を自動化すればよい。
PowerShellはさまざまな機能を利用することができるので、やろうとすればかなりいろいろな処理を自動化することができるのだ。