2013-04-24 33 views
6

爲什麼,當我打開了IRB和我跑
puts 'A'.unpack("B8")
我得到01000001但是當我運行
puts 'A'.unpack("B4B4")
我只得到0100而不是[0100,0001]意外的解壓結果

分辨率只解壓全字節嗎?沒有更少的?

+1

Ruby文檔有點含糊。然而,Ruby的'pack'和'unpack'幾乎是Perl的直接副本,[Perl's'B'](http://perldoc.perl.org/functions/pack.html)表示「在每個字節內降序排列* *「(強調我的)。 – 2013-04-24 02:54:19

回答

5

讓我們做一些測試,以瞭解行爲:

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

它返回字符的8個最高位(MSB)'A'

> 'A'.unpack('B4') 
=> ["0100"] 

它返回4個MSB焦炭'A'

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

它返回字符的16個MSBs 'A',但因爲只有8我們得到的8個MSB

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

它返回字符'AB'的序列的16個MSB(端8位01000010對應於'B'

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

它返回字符序列'AB'的10個MSB,即,的'A'高8位和2個MSB的'B'

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

它返回字符'ABC'的序列的全部的MSB,(端8位01000011對應於'C'

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

它返回以下的數組:

  • 所述第一元件是所述炭的8個MSB 'A'
  • 第二元件是炭'B'

_

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

它返回以下數組的8個MSB:

  • 第一元素是炭'A'的8個MSB
  • 第二個元素是字符的7個MSBs 'B'

_

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

它返回下列數組:

  • 第一元素是炭'A'
  • 第二元件是炭'B'的8個MSB的4個MSB

_

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

它返回下列數組:

  • 第一元素是字符'AB'
  • 作爲字符已經被消耗的第二個元素是空的序列的16個MSB

_

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

它給你相同的結果,並消耗所有的字符串。

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

它返回下列數組:

  • 第一元素是字符'AB'
  • 作爲字符已經被消耗的第二個元素是空的序列的9個MSB

作爲結論,

該指令BN在字符串上會消耗至多字符串的第一個((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'A'.unpack('B4B4')返回數組["0100", ""]

+0

哇!感謝您的腿部工作!我現在知道了。我希望它能夠逐字地逐字地解壓縮,並且如果需要的話只消耗一半的字符。我沒有考慮該指令使用字符串中的整個字符。 – Justin 2013-04-25 18:23:53