2011年1月20日木曜日

pack() unpack()

どうも perl の pack(), unpack() がいつまでたっても身につかない。
初歩的すぎる話題だけどいつもなんだかんだで調べちゃう。だから恥ず
かしいけどここにメモっておく。

例えば Hex の "5a" なんてのは "Z" だけどこの変換を行うには以下。

 $bstr = pack("H*", "5a");

第二引数が Hex だよんてことを第一引数で定義してる。第一引数の
種類はリファレンスで調べて。この部分の *は後に続く文字列の数
でもよい(*は最後までという意味) 。例えば上記の場合 "H1" なん
てしちゃうと、はじめの "5" だけをバイナリ変換しちゃうので 0x50
のバイナリ表現が $bstr にはいっちゃう("P"という文字だけど)。

で、unpack はその逆で、バイナリ文字列を Hex 表現等にしたりする。

だから上記の結果の $bstr を unpack("H*", $bstr) なんてすると、
"Z" の Hex 表現の "5a" が得られる。

ちなみになんで pack とか unpack の話題だったのかというと、slappasswd
で得られるパスワードを base16 にしたかったのです。

この場合は、slappasswd で得られる文字列は base64 なのでこれを
デコードしてバイナリ化、んでそれを unpack("H*", )すれば base16
な表現が得られるというわけ。

0 件のコメント:

コメントを投稿