GoldenNewby
GoldenNewby

Reputation: 4452

Parse bit strings in Perl

When working with unpack, I had hoped that b3 would return a bitstring, 3 bits in length.

The code that I had hoped to be writing (for parsing a websocket data packet) was:

my($FIN,$RSV1, $RSV2, $RSV3, $opcode, $MASK, $payload_length) = unpack('b1b1b1b1b4b1b7',substr($read_buffer,0,2));

I noticed that this doesn't do what I had hoped.

If I used b16 instead of the template above, I get the entire 2 bytes loaded into first variable as "1000000101100001".

That's great, and I have no problem with that.

I can use what I've got so far, by doing a bunch of substrings, but is there a better way of doing this? I was hoping there would be a way to process that bit string with a template similar to the one I attempted to make. Some sort of function where I can pass the specification for the packet on the right hand side, and a list of variables on the left?

Edit: I don't want to do this with a regex, since it will be in a very tight loop that will occur a lot.

Edit2: Ideally it would be nice to be able to specify what the bit string should be evaluated as (Boolean, integer, etc).

Upvotes: 0

Views: 1072

Answers (1)

ArtMat
ArtMat

Reputation: 2150

If I have understood correctly, your goal is to split the 2-bytes input to 7 new variables. For this purpose you can use bitwise operations. This is an example of how to get your $opcode value:

my $b4 = $read_buffer & 0x0f00;  # your mask to filter 9-12 bits
$opcode = $b4 >> 8;              # rshift your bits 

You can do the same manipulations (maybe in a single statement, if you want) for all your variables and it should execute at a resonable good speed.

Upvotes: 1

Related Questions