爲什麼,當我打開了IRB和我跑
puts 'A'.unpack("B8")
我得到01000001
但是當我運行
puts 'A'.unpack("B4B4")
我只得到0100
而不是[0100,0001]
?意外的解壓結果
分辨率只解壓全字節嗎?沒有更少的?
爲什麼,當我打開了IRB和我跑
puts 'A'.unpack("B8")
我得到01000001
但是當我運行
puts 'A'.unpack("B4B4")
我只得到0100
而不是[0100,0001]
?意外的解壓結果
分辨率只解壓全字節嗎?沒有更少的?
讓我們做一些測試,以瞭解行爲:
> '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"]
它返回以下的數組:
'A'
'B'
_
> 'AB'.unpack('B8B7')
=> ["01000001", "0100001"]
它返回以下數組的8個MSB:
'A'
的8個MSB'B'
_
> 'AB'.unpack('B4B8')
=> ["0100", "01000010"]
它返回下列數組:
'A'
'B'
的8個MSB的4個MSB_
> 'AB'.unpack('B16B8')
=> ["0100000101000010", ""]
它返回下列數組:
'AB'
_
> 'AB'.unpack('B*B8')
=> ["0100000101000010", ""]
它給你相同的結果,並消耗所有的字符串。
> 'AB'.unpack('B9B8')
=> ["010000010", ""]
它返回下列數組:
'AB'
該指令BN
在字符串上會消耗至多字符串的第一個((N-1)/8) + 1
字符。如果字符串中仍有字符,並且您有第二個指令BM
,則最多可消耗字符串的下一個((M-1)/8) + 1
字符。對於所有的下一個指令都是如此。如果使用指令B*
,它將消耗所有字符,並返回其相應MSB的序列。
例如:
'ABCDEFG'.unpack('B17B*B8')
它應該返回我們:
ABC
DEFG
讓我們來看看:
> 'ABCDEFG'.unpack('B17B*B8')
=> ["01000001010000100", "01000100010001010100011001000111", ""]
事實上作爲第一個指令,消耗焦炭A
'A'.unpack('B4B4')
返回數組["0100", ""]
。
哇!感謝您的腿部工作!我現在知道了。我希望它能夠逐字地逐字地解壓縮,並且如果需要的話只消耗一半的字符。我沒有考慮該指令使用字符串中的整個字符。 – Justin 2013-04-25 18:23:53
Ruby文檔有點含糊。然而,Ruby的'pack'和'unpack'幾乎是Perl的直接副本,[Perl's'B'](http://perldoc.perl.org/functions/pack.html)表示「在每個字節內降序排列* *「(強調我的)。 – 2013-04-24 02:54:19