[erlang-questions] bit syntax

7stud 7stud@REDACTED
Fri Dec 14 03:29:27 CET 2012


-----Original Message-----
From: "Dmitry Klionsky" [dm.klionsky@REDACTED]
Date: 11/30/2012 03:26 AM
To: erlang-questions@REDACTED
Subject: Re: [erlang-questions] bit syntax

Hi!

All below comes from 
http://www.erlang.org/doc/programming_examples/bit_syntax.html

...
Value:Size
...
The Size part of the segment multiplied by the unit in the 
TypeSpecifierList (described below) gives the number of bits for the 
segment. In construction, Size is any
expression that evaluates to an integer. In matching, Size must be a 
constant expression or a variable.
...
=============

Hi,

Thanks for the explanation.  What is the reason for allowing a variable but not an expression containing a variable?


===END===
And (2*8) is a legal Size:

7> <<Length, Value:(2*8)>> = X.
<<2,1,0>>

This works because (2*8) really evaluates at compile time and it equals to

<<Length, Value:16>> = X.



12> <<Length, Value:(Length*8)>> = X.
* 1: illegal bit size

The expression (Length*8) is supported when constructing a binary. This 
is definitely a pattern matching, so as stated above: the Size must be a 
constant expression or a variable. Not an expression to be evaluated at 
runtime.

As a workaround you can do this

 > <<Length, Rest/binary>> = X.
 > ValueLen = Length*8.
 > <<Value:ValueLen>> = Rest.



76> << [49, 50, 51, 52] >>.
** exception error: bad argument

77> X = "1234".
"1234"

78> <<X>>.
** exception error: bad argument

The only way you can do this is

list_to_binary([49, 50, 51, 52]).
and
list_to_binary("1234").



BR,
Dmitry


On 11/30/2012 09:20 AM, 7stud wrote:
> Hi,
>
> I have a couple of questions about the bit syntax.
>
> 1) I can read the first byte of a binary to get the length of the next value:
>
> 1> X = <<16, 256:16>>.
> <<16,1,0>>
>
> 2> <<Length, Value:Length>> = X.
> <<16,1,0>>
>
> 3> Length.
> 16
>
> 4> Value.
> 256
>
>
>
> And (2*8) is a legal Size:
>
> 5> f().
> ok
>
> 6> X = <<2, 256:16>>.
> <<2,1,0>>
>
> 7> <<Length, Value:(2*8)>> = X.
> <<2,1,0>>
>
> 8> Length.
> 2
>
> 9> Value.
> 256
>
>
> So why does Size = Length*8 fail when Length=2?
>
> 10> f(Length).
> ok
>
> 11> f(Value).
> ok
>
> 12> <<Length, Value:(Length*8)>> = X.
> * 1: illegal bit size
>
>
>
>
> 2)  What is going on here:
>
>
> 73> f().
> ok
>
> 74> <<"1234">>.
> <<"1234">>
>
> 75> "1234" == [49, 50, 51, 52].
> true
>
> 76> << [49, 50, 51, 52] >>.
> ** exception error: bad argument
>
> 77> X = "1234".
> "1234"
>
> 78> <<X>>.
> ** exception error: bad argument
>
> In line 74, I can use a string while constructing a binary, but in 76 I can't use the equivalent list.  And in line 77, when I bind the string to a variable, I can't use the variable to construct a binary.
>
> Thanks.
> _______________________________________________
> erlang-questions mailing list
> erlang-questions@REDACTED
> http://erlang.org/mailman/listinfo/erlang-questions


-- 
Best regards,
Dmitry Klionsky

_______________________________________________
erlang-questions mailing list
erlang-questions@REDACTED
http://erlang.org/mailman/listinfo/erlang-questions





More information about the erlang-questions mailing list