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')
それは私たちを返すはずです:
ABCDEFG確認しよう:
> 'ABCDEFG'.unpack('B17B*B8')
=> ["01000001010000100", "01000100010001010100011001000111", ""]
そして、最初のディレクティブが char を消費するので、実際'A'.unpack('B4B4')に配列を返します。["0100", ""]A