packテンプレート文字列

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

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

"iiii"

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

"i4"

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

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

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

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

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

a

ASCII文字列(null文字を詰める/後続するnull文字やスペースを残す)

A

ASCII文字列(スペースを詰める/後続するnull文字やスペースを削除)

Z

null終端文字列(aと同じ / 後続するnull文字を削除)

b

ビットストリング(下位ビットから上位ビット)

B

ビットストリング(上位ビットから下位ビット)

h

16進文字列(下位ニブルが先)

H

16進文字列(上位ニブルが先)

c

char

C

unsigned char

s

short

S

unsigned short

i

int

I

unsigned int

l

long

L

unsigned long

q

ruby 1.7 feature: long long (64 bit 符号付き整数)

Q

ruby 1.7 feature: unsigned long long (64 bit 符号なし整数)

m

base64された文字列。60 オクテットごと(と最後)に改行コードが付加されます。

Base64は、3オクテット(8bits * 3 = 24bits)のバイナリコードをASCII文字の うちの65文字 ([A-Za-z0-9+/]の64文字とpaddingのための'=')だけを使用して 4オクテット(6bits * 4 = 24bits)の印字可能文字列に変換するエンコーディ ング法です。RFC2045で定義されています。

M

quoted-printable encoding された文字列

n

ネットワークバイトオーダー(ビッグエンディアン)のunsigned short

N

ネットワークバイトオーダー(ビッグエンディアン)のunsigned long

v

"VAX"バイトオーダー(リトルエンディアン)のunsigned short

V

"VAX"バイトオーダー(リトルエンディアン)のunsigned long

f

単精度浮動小数点数(機種依存)

d

倍精度浮動小数点数(機種依存)

e

リトルエンディアンの単精度浮動小数点数(機種依存)

E

リトルエンディアンの倍精度浮動小数点数(機種依存)

g

ビッグエンディアンの単精度浮動小数点数(機種依存)

G

ビッグエンディアンの倍精度浮動小数点数(機種依存)

p

ナル終端の文字列へのポインタ

P

構造体(固定長文字列)へのポインタ

u

uuencodeされた文字列

U

utf-8

w

BER圧縮整数

1バイトあたり7ビットを使用して必要最小限のバイト数で任意サイズの 0以上の整数を表す数値表現。各バイトの最上位ビットはデータの最後 を除いて必ず1が立っている(つまり最上位ビットはどこまでデータがあ るかを示している)。

BER は Basic Encoding Rules の略(BER自体 は整数のエンコーディングだ けを表すわけではない。ASN.1 のエンコーディングで使用される)

*2

x

ナルバイト/1バイト読み飛ばす

X

1バイト後退

@

絶対位置への移動

使用例

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

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


*1 `_' は、Perl の真似だったようですが、Perl が途中で '!' に変えたため Ruby ではこれら2つが残ったんだそうです
*2あらい: 2001-04-22 もっとちゃんと調べてから書こう。上記は信用 しないように:p 誰か代わりにしっかりしたのを書いてくれても良いです ちなみに ISO 8825 です