[perl] pack, unpack で 16進文字列を扱うメモ
Perl の中でも関数 pack / unpack が Perl 的でとっつきにくい所だと思うので書いてみました。Ruby, PHP にも同様な関数があるようです。
関数名の覚え方は、pack: バイナリ列に pack する。unpack: バイナリ列を unpack する (文字列・数値など元のデータに戻す)。
16進数文字列を扱うときはフォーマットで必ず 'H' の方を使う。
数値を扱うときは、符号有り・符号無し・リトルエンディアン・ビッグエンディアンに注意。
公式ドキュメント
pack - perldoc.perl.org - 簡潔にまとまった関数ドキュメント
perlpacktut - 素晴らしく詳細なpack/unpackチュートリアル
日本語訳
pack - perldoc.jp
perlpacktut - perldoc.jp
関数名の覚え方は、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
コメント
コメントを投稿