为什么当我打开irb并且我运行
时
puts 'A'.unpack("B8")
我得到01000001
但是当我跑步时
puts 'A'.unpack("B4B4")
我只收到0100
而不是[0100,0001]
?
解包的分辨率只是一个完整的字节吗?没什么?
答案 0 :(得分:5)
让我们做一些测试来理解行为:
> 'A'.unpack('B8')
=> ["01000001"]
它返回char 'A'
> 'A'.unpack('B4')
=> ["0100"]
返回char 'A'
> '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"]
返回以下数组:
'A'
'B'
_
> 'AB'.unpack('B8B7')
=> ["01000001", "0100001"]
返回以下数组:
'A'
'B'
_
> 'AB'.unpack('B4B8')
=> ["0100", "01000010"]
返回以下数组:
'A'
'B'
_
> 'AB'.unpack('B16B8')
=> ["0100000101000010", ""]
返回以下数组:
'AB'
_
> 'AB'.unpack('B*B8')
=> ["0100000101000010", ""]
它为您提供相同的结果,并使用所有字符串。
> 'AB'.unpack('B9B8')
=> ["010000010", ""]
返回以下数组:
'AB'
String上的指令BN
最多会占用String的第一个((N-1) / 8) + 1
个字符。如果字符串中仍有字符,并且您有第二个指令BM
,则最多会消耗字符串的下一个((M-1) / 8) + 1
字符。等等所有下一个指令。如果使用指令B*
,它将使用所有字符,并返回其相应MSB的序列。
例如:
'ABCDEFG'.unpack('B17B*B8')
应该归还给我们:
ABC
DEFG
我们来看看:
> 'ABCDEFG'.unpack('B17B*B8')
=> ["01000001010000100", "01000100010001010100011001000111", ""]
确实'A'.unpack('B4B4')
返回数组["0100", ""]
,因为第一个指令使用了char A
。