2013-04-24 13 views
6

私は01000001を得ることが、私は
puts 'A'.unpack("B4B4")
を実行したときに私だけ0100ない[0100,0001]を取得しますか?予期しないアンパックの結果は、なぜそれがある

アンパックの解像度は1バイトだけですか?何もない?

+1

Rubyのドキュメントは少し曖昧です。しかし、Rubyの 'pack'と' unpack'は、PerlやPerlの '' B''(http://perldoc.perl.org/functions/pack.html)からのまっすぐなコピーです。 "各バイトの中の降順ビット* * "(強調する鉱山)。 –

答えて

5

のは、行動を理解するためにいくつかのテストをやってみましょう:

> 'A'.unpack('B8') 
=> ["01000001"] 

それがchar 'A'

の4つのMSBを返す文字 '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'
  • の8つのMSBであります
  • 第二要素チャーの8つのMSBである'B'

_

> 'AB'.unpack('B8B7') 
=> ["01000001", "0100001"] 

は以下の配列を返し:

  • 最初の要素は文字の8つのMSBである'A'
  • 2番目の要素はcharの7 MSBです'B'

_

> 'AB'.unpack('B4B8') 
=> ["0100", "01000010"] 

それは次の配列を返し:

  • を最初の要素は2番目の要素は文字の8つのMSBであるチャー'A'
  • の4つのMSBである'B'

_

> 'AB'.unpack('B16B8') 
=> ["0100000101000010", ""] 

それは次の配列を返します。最初の要素は文字が既に が消費されているように、第2の要素が空の文字'AB'

  • の配列の16個のMSBである

    • _

      > 'AB'.unpack('B*B8') 
      => ["0100000101000010", ""] 
      

      これは同じ結果をもたらし、すべての文字列を消費します。

      > 'AB'.unpack('B9B8') 
      => ["010000010", ""] 
      

      それは次の配列を返します。最初の要素は文字が既に

    が消費されているように、第2の要素が空の文字'AB'
  • の配列の9個のMSBである

    • 結論として、

      指示文文字列のは、多くとも最初の文字列の((N-1)/8) + 1文字を消費します。文字列に文字が残っていて、2番目のディレクティブBMがある場合、最大で次の((M-1)/8) + 1の文字列を消費します。次のすべての指令についても同様です。ディレクティブB*を使用すると、すべての文字が消費され、対応するMSBのシーケンスが返されます。例えば

      'ABCDEFG'.unpack('B17B*B8') 
      

      それは私たちを返す必要があります。

      • シーケンスの17個のMSBにシーケンスのABC
      • すべてのMSB DEFG
      • 空のビット列

      レッツ・チェック:最初のディレクティブがchar Aを消費する配列["0100", ""]を返し'A'.unpack('B4B4')

      > 'ABCDEFG'.unpack('B17B*B8') 
      => ["01000001010000100", "01000100010001010100011001000111", ""] 
      

      そして実際。

  • +0

    うわー!足の仕事に感謝します!今、私は分かる。私は文字通り少しずつ解凍し、要求された場合には文字の半分しか消費しないことを期待していました。文字列全体の文字を消費する命令は考慮しませんでした。 – Justin