带有位串的意外解压缩结果

时间:2013-04-24 02:27:16

标签: ruby unpack

为什么当我打开irb并且我运行
puts 'A'.unpack("B8")
我得到01000001但是当我跑步时 puts 'A'.unpack("B4B4")
我只收到0100而不是[0100,0001]

解包的分辨率只是一个完整的字节吗?没什么?

1 个答案:

答案 0 :(得分:5)

让我们做一些测试来理解行为:

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

它返回char 'A'

的8个最高有效位(MSB)
> 'A'.unpack('B4')
 => ["0100"]

返回char 'A'

的4个MSB
> 'A'.unpack('B16')
 => ["01000001"]

它返回char 'A'的16个MSB,但由于只有8个,我们得到8个MSB

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

返回字符'AB'序列的16个MSB(结束8位01000010对应'B'

> 'AB'.unpack('B10')
 => ["0100000101"]

返回字符'AB'序列的10个MSB,即'A'的8个MSB和'B'的2个MSB

> 'ABC'.unpack('B*')
 => ["010000010100001001000011"]

返回字符序列'ABC'的所有MSB,(结束8位01000011对应'C'

> 'AB'.unpack('B8B8')
 => ["01000001", "01000010"]

返回以下数组:

  • 第一个元素是char 'A'
  • 的8个MSB
  • 第二个元素是char 'B'
  • 的8个MSB

_

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

返回以下数组:

  • 第一个元素是char 'A'
  • 的8个MSB
  • 第二个元素是char 'B'
  • 的7个MSB

_

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

返回以下数组:

  • 第一个元素是char 'A'
  • 的4个MSB
  • 第二个元素是char 'B'
  • 的8个MSB

_

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

返回以下数组:

  • 第一个元素是字符'AB'
  • 序列的16个MSB
  • 第二个元素为空,因为字符已被消耗

_

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

它为您提供相同的结果,并使用所有字符串。

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

返回以下数组:

  • 第一个元素是字符'AB'
  • 序列的9个MSB
  • 第二个元素为空,因为字符已被消耗

作为结论,

String上的指令BN最多会占用String的第一个((N-1) / 8) + 1个字符。如果字符串中仍有字符,并且您有第二个指令BM,则最多会消耗字符串的下一个((M-1) / 8) + 1字符。等等所有下一个指令。如果使用指令B*,它将使用所有字符,并返回其相应MSB的序列。

例如:

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

应该归还给我们:

  • 序列ABC
  • 的17个MSB
  • 序列DEFG
  • 的所有MSB
  • 空位串

我们来看看:

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

确实'A'.unpack('B4B4')返回数组["0100", ""],因为第一个指令使用了char A