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

Dmitry Kolesnikov dmkolesnikov@REDACTED
Wed Jun 25 08:37:17 CEST 2014


Hello,

Here is one way to make it:

Head = byte_size(BinC) * 8 - 24.
<<H:Head, T:24>> = BinC.

The reverse operation for binary is expensive. 

Best Regards,
Dmitry >-|-|-(*>


> On 25.6.2014, at 4.11, Richard McLean <rmcl2303@REDACTED> wrote:
> 
> 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...
> 
> eg.
> 1> BinA = <<1,2,3,4>>.
> <<1,2,3,4>>
> 2>  <<BinB:8/binary-unit:1,BinC/binary>> = BinA.
> <<1,2,3,4>>
> 3> BinB.
> <<1>>
> 4> BinC.
> <<2,3,4>>
> 
> 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.
> 
> eg.
> 1> BinA = <<1,2,3,4>>.
> <<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 ?
> 
> Regards
> 
> Richard 
> 
> _______________________________________________
> erlang-questions mailing list
> erlang-questions@REDACTED
> http://erlang.org/mailman/listinfo/erlang-questions
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20140625/8ca39260/attachment.htm>


More information about the erlang-questions mailing list