読者です 読者をやめる 読者になる 読者になる

harry’s memorandum

おれおれメモ

base64の備忘録

UNIX Windows shell vbs

とりあえず、base64をしたかったのですが、調べると色々な方法があるなぁ、と思ったので備忘録。

opensslコマンド

一番よく使う方法かな。

$ echo -n dharry | openssl enc -base64
ZGhhcnJ5
$ echo  "ZGhhcnJ5" | openssl  enc -d -base64; echo
dharry
base64コマンド

Linuxだとこれかな。coreutilsは便利だけど他のUNIXだとなかったりするんだな。

$ echo -n dharry | base64
ZGhhcnJ5
$ echo -n "ZGhhcnJ5" | base64 -d; echo
dharry
$ rpm -qf /usr/bin/base64
coreutils-5.97-34.el5_8.1
nkfコマンド

これはこれで便利

$ echo -n "dharry"| nkf  -MB; echo
ZGhhcnJ5
$ echo -n "ZGhhcnJ5"| nkf -mB; echo
dharry
perl

perlはどのUNIXでもあるから一番楽かも。でもHP-UX11.00ぐらいだと厳しい。

$ echo -n "dharry" | perl -MMIME::Base64 -0777 -ne 'print encode_base64($_)'
ZGhhcnJ5
$ echo -n "ZGhhcnJ5" | perl -MMIME::Base64 -ne 'print decode_base64($_)'; echo
dharry
ruby
$ echo -n dharry   | ruby -r base64 -e 'puts Base64.encode64(STDIN.read)'
ZGhhcnJ5
$ echo -n ZGhhcnJ5 | ruby -r base64 -e 'puts Base64.decode64(STDIN.read)'
dharry
python
$ echo -n dharry | python -c "import base64,sys; base64.encode(sys.stdin,sys.stdout)"
ZGhhcnJ5
$ echo -n ZGhhcnJ5 | python -c "import base64,sys; base64.decode(sys.stdin,sys.stdout)"
dharry
PowerShell

コマンドレットは便利と思ったけどいまだになじめない。慣れは重要ですね。

PS C:\Users\dharry> $str = "dharry"
PS C:\Users\dharry> $str =  [Convert]::ToBase64String([System.Text.Encoding]::GetEncoding("iso-2022-jp").GetBytes($str))
PS C:\Users\dharry> $str
ZGhhcnJ5
tcl

tclshで試してみた。centosのtclだとbase64ライブラリがなかったのでActiveStateのActiveTCL8.5.11.1で確認。

% package require base64
2.4.2
% base64::encode "dharry"
ZGhhcnJ5
curl

apachebasic認証に渡すときはbase64にしているのでwgetcurlでもいけるはずだ。でも少しawkで頑張れば行けると思うけど面倒だから使わない。

$ curl -vu dharry: http://example.com 2>&1 | awk '{ if($0 ~/Authorization/) print $(NF)}'
ZGhhcnJ5Og==
$ echo -n ":" | base64
Og==
vbs

なんだかvbsが嫌になってきた。

Private Function base64(str)
	Dim dom, elem, bin, result

	Set st = CreateObject("ADODB.Stream")
	With st
		.Type = 2
		.Charset = "Shift-JIS"
		.Open
		.WriteText str
		.Position = 0
		.Type = 1
		bin = st.Read
		.Close
	End With

	Set dom = CreateObject("Microsoft.XMLDOM")
	Set elem = dom.CreateElement("tmp")
	elem.DataType = "bin.base64"
	elem.NodeTypedValue = bin
	result = elem.Text

	base64 = result
End Function
Wscript.echo base64("dharry")