irbを開いて実行する
puts 'A'.unpack("B8")
と取得するのに01000001
、実行すると取得する
puts 'A'.unpack("B4B4")
だけで取得0100
しないのは[0100,0001]
なぜですか?
アンパックの解像度はフルバイトのみですか? それ以下はありませんか?
動作を理解するためにいくつかのテストを行いましょう。
> 'A'.unpack('B8')
=> ["01000001"]
char の上位 8 ビット (MSB) を返します。'A'
> 'A'.unpack('B4')
=> ["0100"]
char の上位 4 ビットを返します。'A'
> 'A'.unpack('B16')
=> ["01000001"]
char の 16 個の MSB を返しますが'A'
、8 個しかないため、8 個の MSB を取得します。
> 'AB'.unpack('B16')
=> ["0100000101000010"]
一連の文字の上位 16 ビットを返します'AB'
(最後の 8 ビット01000010
は に対応し'B'
ます) 。
> 'AB'.unpack('B10')
=> ["0100000101"]
chars のシーケンスの 10 MSB 'AB'
、つまり の 8 MSB'A'
と の 2 MSB を返します。'B'
> 'ABC'.unpack('B*')
=> ["010000010100001001000011"]
chars のシーケンスのすべての MSB を返します'ABC'
(最後の 8 ビット01000011
は に対応し'C'
ます) 。
> 'AB'.unpack('B8B8')
=> ["01000001", "01000010"]
次の配列を返します。
'A'
'B'
_
> 'AB'.unpack('B8B7')
=> ["01000001", "0100001"]
次の配列を返します。
'A'
'B'
_
> 'AB'.unpack('B4B8')
=> ["0100", "01000010"]
次の配列を返します。
'A'
'B'
_
> 'AB'.unpack('B16B8')
=> ["0100000101000010", ""]
次の配列を返します。
'AB'
_
> 'AB'.unpack('B*B8')
=> ["0100000101000010", ""]
同じ結果が得られ、すべての文字列が消費されます。
> 'AB'.unpack('B9B8')
=> ["010000010", ""]
次の配列を返します。
'AB'
Stringに対するディレクティブは、最大でも StringBN
の最初の文字を消費し((N-1) / 8) + 1
ます。文字列にまだ文字があり、2 番目のディレクティブがあるBM
場合、最大でも文字列の次の文字を消費します((M-1) / 8) + 1
。次のすべてのディレクティブについても同様です。ディレクティブを使用するB*
と、すべての文字が消費され、対応する MSB のシーケンスが返されます。
例えば:
'ABCDEFG'.unpack('B17B*B8')
それは私たちを返すはずです:
ABC
DEFG
確認しよう:
> 'ABCDEFG'.unpack('B17B*B8')
=> ["01000001010000100", "01000100010001010100011001000111", ""]
そして、最初のディレクティブが char を消費するので、実際'A'.unpack('B4B4')
に配列を返します。["0100", ""]
A