packテンプレート文字列

以下にあげるものは、Array#packString#unpack のテンプレート文字の一覧です。テンプレート文字は後に「長さ」を表す数字 を続けることができます。「長さ」の代わりに`*'とすることで「残り全て」 を表すこともできます。

長さの意味はテンプレート文字により異なりますが大抵、

"iiii"

のように連続するテンプレート文字は

"i4"

と書き換えることができます。

テンプレート文字列中の空白類は無視されます。 ruby 1.7 feature: また、`#' から改行あるいはテンプレート文字列の最後まではコメントとみな され無視されます。

整数のテンプレート文字

各テンプレート文字の説明の中で、 short や long はシステムによらずそれぞれ 2, 4バイトサ イズの数値(32ビットマシンで一般的なshort, longのサイズ)を意味していま す。`s', `S', `l', `L' に対しては直後に `_'または`!'を("s!"のように) 続けることでシステム依存のshort, long のサイズにすることもできます。 *1

`i', `I' (int)のサイズは常にシステム依存であり、`n', `N', `v', `V' のサイズは常にシステム依存ではない(`!'をつけられない)ことに注意してください。 *2

つまり、IO#ioctl などで C の構造体を渡すときのように、 システム依存のサイズとエンディアンに合わせる必要があるときには `s!', `S!', `i!', `I!', `l!', `L!', `q!', `Q!' を用います。 また、ネットワークプロトコルやファイルフォーマットのように、 システムに依存しないデータを扱うときには `n', `N', `v', `V' を用います。

まとめると以下のようになります。

各テンプレート文字の説明

説明中、Array#packとString#unpackで違いのあるものは/で区切って 「Array#packの説明/String#unpackの説明」としています。

使用例

以下、pack/unpack の使用例の一部です。

pack を使用しなくても同じことができる場合はその例も載せています。 pack は暗号になりやすい面があることを考慮し、pack を使いたくない人 に別解を示すためです。


*1 `_' は、Perl の真似だったようですが、Perl が途中で '!' に変えたため Ruby ではこれら2つが残ったんだそうです
*2 ruby-1.8.1, pack.c:1.58 で変わった?



rubyist ML