6

irbを開いて実行する
puts 'A'.unpack("B8")
と取得するのに01000001、実行すると取得する
puts 'A'.unpack("B4B4")
だけで取得0100しないのは[0100,0001]なぜですか?

アンパックの解像度はフルバイトのみですか? それ以下はありませんか?

4

1 に答える 1

5

動作を理解するためにいくつかのテストを行いましょう。

> '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"]

次の配列を返します。

  • 最初の要素は char の上位 8 ビットです。'A'
  • 2 番目の要素は、char の上位 8 ビットです。'B'

_

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

次の配列を返します。

  • 最初の要素は char の上位 8 ビットです。'A'
  • 2 番目の要素は、char の上位 7 ビットです。'B'

_

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

次の配列を返します。

  • 最初の要素は、char の 4 つの MSB です。'A'
  • 2 番目の要素は、char の上位 8 ビットです。'B'

_

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

次の配列を返します。

  • 最初の要素は、一連の文字の上位 16 ビットです。'AB'
  • 文字がすでに消費されているため、2 番目の要素は空です。

_

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

同じ結果が得られ、すべての文字列が消費されます。

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

次の配列を返します。

  • 最初の要素は、一連の文字の上位 9 ビットです。'AB'
  • 文字がすでに消費されているため、2 番目の要素は空です。

結論として、

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

例えば:

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

それは私たちを返すはずです:

  • シーケンスの上位 17 ビットABC
  • シーケンスのすべての MSBDEFG
  • 空のビット文字列

確認しよう:

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

そして、最初のディレクティブが char を消費するので、実際'A'.unpack('B4B4')に配列を返します。["0100", ""]A

于 2013-04-24T13:03:27.777 に答える