Why is it that when I open up irb and I runputs 'A'.unpack("B8")
I get 01000001
but when I runputs 'A'.unpack("B4B4")
I only get 0100
and not [0100,0001]
?
Is the resolution of unpack only a full byte? Nothing less?
Let's do some tests to understand the behavior:
> 'A'.unpack('B8')
=> ["01000001"]
It returns the 8 Most Significant Bits (MSBs) of char 'A'
> 'A'.unpack('B4')
=> ["0100"]
It returns the 4 MSBs of char 'A'
> 'A'.unpack('B16')
=> ["01000001"]
It returns the 16 MSBs of char 'A'
, but as there is only 8 we get the 8 MSBs
> 'AB'.unpack('B16')
=> ["0100000101000010"]
It returns the 16 MSBs of the sequence of chars 'AB'
(the end 8 Bits 01000010
corresponds to 'B'
)
> 'AB'.unpack('B10')
=> ["0100000101"]
It returns the 10 MSBs of the sequence of chars 'AB'
, i.e. the 8 MSBs of 'A'
and the 2 MSBs of 'B'
> 'ABC'.unpack('B*')
=> ["010000010100001001000011"]
It returns all the MSBs of the sequence of chars 'ABC'
, (the end 8 Bits 01000011
corresponds to 'C'
)
> 'AB'.unpack('B8B8')
=> ["01000001", "01000010"]
It returns the following array:
'A'
'B'
_
> 'AB'.unpack('B8B7')
=> ["01000001", "0100001"]
It returns the following array:
'A'
'B'
_
> 'AB'.unpack('B4B8')
=> ["0100", "01000010"]
It returns the following array:
'A'
'B'
_
> 'AB'.unpack('B16B8')
=> ["0100000101000010", ""]
It returns the following array:
'AB'
_
> 'AB'.unpack('B*B8')
=> ["0100000101000010", ""]
It gives you the same result, and consume all the string.
> 'AB'.unpack('B9B8')
=> ["010000010", ""]
It returns the following array:
'AB'
the directive BN
over a String will consume at most the first ((N-1) / 8) + 1
chars of the String. If there is still chars in the string, and you have a second directive BM
, you'll consume at most the next ((M-1) / 8) + 1
chars of the String. And so on for all the next directives. If you use the directive B*
, it will consume all chars, and returns the sequence of their corresponding MSBs.
For instance:
'ABCDEFG'.unpack('B17B*B8')
It should returns us:
ABC
DEFG
Let's check:
> 'ABCDEFG'.unpack('B17B*B8')
=> ["01000001010000100", "01000100010001010100011001000111", ""]
And indeed 'A'.unpack('B4B4')
returns the array ["0100", ""]
as the first directive consumes the char A
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With