I need to extract certain bits of a byte and covert the extract bits back to a hex value.
Example (the value of the byte is 0xD2) :
76543210 bit position
11010010 is 0xD2
0010b
is 0x2
01b
is 0x1
11b
is 0x3
I somehow need to get from the byte is 0xD2
to channel is 0x2
, controller is 0x1
, port is 0x3
I googled allot and found the functions pack
/unpack
, vec
and sprintf
. But I'm scratching by head how to use the functions to achieve this. Any idea how to achieve this in Perl ?
What's the initial format?
my $chr = chr(0b11010010); # A character e.g. from read()
my $bin = '11010010'; # Binary
my $hex = 'D2'; # Hexadecimal
my $num = 0b11010010; # A number.
my $num = 0xD2; # A number.
You want to start by converting it to a number
my $num = ord($chr);
my $num = unpack('C', $chr); # Alternative
my $num = oct("0b$bin");
my $num = hex($hex);
Then you use shifts and masks.
my $channel = ($num >> 0) & 0xF; # Or just: $num & 0xF
my $controller = ($num >> 4) & 0x3;
my $port = ($num >> 6) & 0x3; # Or just: $num >> 6
(You could use 0b1111
, 0b11
and 0b11
for the masks. Most people work in hex.)
Or let vec
figure out the masks for you.
my $channel = vec $num, 0, 4;
my $controller = vec $num, 4, 2;
my $port = vec $num, 6, 2;
Here's an example for $controller
:
11010010
>> 4
--------
11010010
& 11
--------
01
(Some zeroes omitted for clarity.)
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