[erlang-questions] matching Rest/binary using bit syntax - why does it have to be the last element specified if all other elements are sized ?
Andreas Schultz
aschultz@REDACTED
Wed Jun 25 09:37:08 CEST 2014
Hi,
----- Original Message -----
> 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.
As you demonstrated, no reverse operation is needed. The compiler
could actually be smart enough to generate above code by itself
when given a match like:
<<H/binary, T:24>> = BinC
Even having the variable length part (as long as there is only
one) somewhere in the middle, would still allow the compiler
to construct the expression.
Things would become a bit more complicated in case or guard
matches.
Question to experts of the Erlang internals: Is there a non trivial
reason the compiler/runtime system can't handle such matches?
Regards
Andreas
>
> 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
>
> _______________________________________________
> erlang-questions mailing list
> erlang-questions@REDACTED
> http://erlang.org/mailman/listinfo/erlang-questions
>
--
--
Dipl. Inform.
Andreas Schultz
email: as@REDACTED
phone: +49-391-819099-224
mobil: +49-170-2226073
------------------- enabling your networks -------------------
Travelping GmbH phone: +49-391-819099229
Roentgenstr. 13 fax: +49-391-819099299
D-39108 Magdeburg email: info@REDACTED
GERMANY web: http://www.travelping.com
Company Registration: Amtsgericht Stendal Reg No.: HRB 10578
Geschaeftsfuehrer: Holger Winkelmann | VAT ID No.: DE236673780
--------------------------------------------------------------
More information about the erlang-questions
mailing list