Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Erlang howto make a list from this binary <<"a,b,c">>

I have a binary <<"a,b,c">> and I would like to extract the information from this binary.

So I would like to have something like A=a, B=b and so on. I need a general approach on this because the binary string always changes.

So it could be <<"aaa","bbb","ccc">>...

I tried to generate a list

erlang:binary_to_list(<<"a","b","c">>) 

but I get string as a result.

"abc"

Thank you.

like image 988
Andreas Avatar asked May 26 '11 16:05

Andreas


1 Answers

You did use the right method.

binary_to_list(Binary) -> [char()]

Returns a list of integers which correspond to the bytes of Binary.

There is no string type in Erlang: http://www.erlang.org/doc/reference_manual/data_types.html#id63119. The console just displays the lists in string representation as a courtesy, if all elements are in printable ASCII range.

You should read Erlang's "Bit Syntax Expressions" documentation to understand how to work on binaries.

Do not convert the whole binary into a list if you don't need it in list representation!

To extract the first three bytes you could use

<<A, B, C, Rest/binary>> = <<"aaa","bbb","ccc">>.

If you want to iterate over the binary data, you can use binary comprehension.

<< <<(F(X))>> || <<X>> <= <<"aaa","bbb","ccc">> >>.

Pattern matching is possible, too:

test(<<A, Tail/binary>>, Accu) -> test(Tail, Accu+A);
test(_, Accu) -> Accu.

882 = test(<<"aaa","bbb","ccc">>, 0).

Even for reading one UTF-8 character at once. So to convert a binary UTF-8 string into Erlang's "list of codepoints" format, you could use:

test(<<A/utf8, Tail/binary>>, Accu) -> test(Tail, [A|Accu]);
test(_, Accu) -> lists:reverse(Accu).

[97,97,97,600,99,99,99] = test(<<"aaa", 16#0258/utf8, "ccc">>, "").

(Note that `<<"aaa","bbb","ccc">> = <<"aaabbbccc">>. Don't actually use the last code snipped but the linked method.)

like image 73
kay Avatar answered Oct 22 '22 18:10

kay