[erlang-questions] matching Rest/binary using bit syntax - why does it have to be the last element specified if all other elements are sized ?

Richard McLean rmcl2303@REDACTED
Wed Jun 25 03:11:44 CEST 2014

This is my first question to the mailing list so apologies if there are any newbie errors.

Regarding bit syntax and pattern matching, you can match the remaining part of the binary using the Rest/binary idiom as long as the element of unspecified size (ie Rest/binary) is at the end of the pattern (ie. the very last specified element)...

eg. suppose I have a binary of unknown size (here I'm using <<1,2,3,4>> as the example) and I want to separate it into 2 binaries  - one containing the first 8 bits, and the other containing the remainder...

1> BinA = <<1,2,3,4>>.
2>  <<BinB:8/binary-unit:1,BinC/binary>> = BinA.
3> BinB.
4> BinC.

So far so good...

Now suppose I want to take the same input binary (of unknown size) and this time I want to separate it into 2 binaries - one containing the LAST 24 bits (say some sort of footer), and the other containing the remainder (ie all the PRECEDING data)...

This should still be possible from the the compiler/erlang VM point of view as we are still specifying all the element sizes except one, but erlang generates an error if the binary element of unspecified size is anything but the last match element.

1> BinA = <<1,2,3,4>>.
2> <<BinB/binary, BinC:8/binary-unit:3>> = BinA.
* 1: a binary field without size is only allowed at the end of a binary pattern

What is the easiest way to achieve this sort of thing ?
I'm supposing the binary could be reversed, the front X bits extracted, then reversing the extracted binary and the remainder, but is there an easier way ?

And if there are any of the erlang maintainers reading this, would it be possible in a future release to change the rules on the Rest/binary idiom to allow Rest/binary to be any element of the match pattern as long as all other elements are size specified ?

I don't think it would be a big change to the implement but perhaps there are hidden gotchas I'm not considering ?



-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20140625/5fc4ba31/attachment.htm>

More information about the erlang-questions mailing list