私は01000001
を得ることが、私は
puts 'A'.unpack("B4B4")
を実行したときに私だけ0100
ない[0100,0001]
を取得しますか?予期しないアンパックの結果は、なぜそれがある
アンパックの解像度は1バイトだけですか?何もない?
私は01000001
を得ることが、私は
puts 'A'.unpack("B4B4")
を実行したときに私だけ0100
ない[0100,0001]
を取得しますか?予期しないアンパックの結果は、なぜそれがある
アンパックの解像度は1バイトだけですか?何もない?
のは、行動を理解するためにいくつかのテストをやってみましょう:
> 'A'.unpack('B8')
=> ["01000001"]
それがchar 'A'
'A'
> 'A'.unpack('B4')
=> ["0100"]
の8つの最上位ビット(MSB)を返します。
> 'A'.unpack('B16')
=> ["01000001"]
16ビットのMSBを返します。'A'
、我々はそれが返さ
> 'AB'.unpack('B10')
=> ["0100000101"]
(エンド8ビット01000010
が'B'
に対応)これは文字'AB'
の配列の16個のMSBを返す8つのMSB
> 'AB'.unpack('B16')
=> ["0100000101000010"]
を取得8のみ存在するように文字列'AB'
の10個のMSB、すなわち'A'
の8つのMSBと
> 'AB'.unpack('B8B8')
=> ["01000001", "01000010"]
はそれを返すこれは文字'ABC'
の配列の全てのMSB、(エンド8ビット01000011
が'C'
に対応する)を返し'B'
> 'ABC'.unpack('B*')
=> ["010000010100001001000011"]
の2つのMSB以下の配列:
'A'
'B'
_
> 'AB'.unpack('B8B7')
=> ["01000001", "0100001"]
は以下の配列を返し:
'A'
'B'
_
> 'AB'.unpack('B4B8')
=> ["0100", "01000010"]
それは次の配列を返し:
'A'
'B'
_
> 'AB'.unpack('B16B8')
=> ["0100000101000010", ""]
それは次の配列を返します。最初の要素は文字が既に が消費されているように、第2の要素が空の文字'AB'
_
> 'AB'.unpack('B*B8')
=> ["0100000101000010", ""]
これは同じ結果をもたらし、すべての文字列を消費します。
> 'AB'.unpack('B9B8')
=> ["010000010", ""]
それは次の配列を返します。最初の要素は文字が既に
'AB'
指示文文字列のは、多くとも最初の文字列の((N-1)/8) + 1
文字を消費します。文字列に文字が残っていて、2番目のディレクティブBM
がある場合、最大で次の((M-1)/8) + 1
の文字列を消費します。次のすべての指令についても同様です。ディレクティブB*
を使用すると、すべての文字が消費され、対応するMSBのシーケンスが返されます。例えば
:
'ABCDEFG'.unpack('B17B*B8')
それは私たちを返す必要があります。
ABC
DEFG
レッツ・チェック:最初のディレクティブがchar A
を消費する配列["0100", ""]
を返し'A'.unpack('B4B4')
> 'ABCDEFG'.unpack('B17B*B8')
=> ["01000001010000100", "01000100010001010100011001000111", ""]
そして実際。
うわー!足の仕事に感謝します!今、私は分かる。私は文字通り少しずつ解凍し、要求された場合には文字の半分しか消費しないことを期待していました。文字列全体の文字を消費する命令は考慮しませんでした。 – Justin
Rubyのドキュメントは少し曖昧です。しかし、Rubyの 'pack'と' unpack'は、PerlやPerlの '' B''(http://perldoc.perl.org/functions/pack.html)からのまっすぐなコピーです。 "各バイトの中の降順ビット* * "(強調する鉱山)。 –