2011-01-29

[perl] pack, unpack で 16進文字列を扱うメモ

Perl の中でも関数 pack / unpack が Perl 的でとっつきにくい所だと思うので書いてみました。Ruby, PHP にも同様な関数があるようです。

関数名の覚え方は、pack: バイナリ列に pack する。unpack: バイナリ列を unpack する (文字列・数値など元のデータに戻す)。

16進数文字列を扱うときはフォーマットで必ず 'H' の方を使う。

unpack('H*', "\xF1\xE2")  # f1e2
unpack('h*', "\xF1\xE2")  # 1f2e (low nibble first 形式: ほとんどの人に必要なし)

# 繰り返し数の数え方にも注意:バイト単位ではなく[0-9a-f]の文字単位
unpack('H2', "\xF1\xE2")  # f1
unpack('H3', "\xF1\xE2")  # f1e

# 16進数文字列をpackするとバイナリになる
# 'C'は符号無し8bit整数。1バイトで収まるのでエンディアンの区別なし。
unpack('C', pack('H*', '10')) # 16
unpack('C', pack('H*', 'ff')) # 255

数値を扱うときは、符号有り・符号無し・リトルエンディアン・ビッグエンディアンに注意。

公式ドキュメント
pack - perldoc.perl.org - 簡潔にまとまった関数ドキュメント
perlpacktut - 素晴らしく詳細なpack/unpackチュートリアル

日本語訳
pack - perldoc.jp
perlpacktut - perldoc.jp