Erlang как сделать список из этого двоичного файла << "a, b, c" >> - PullRequest
6 голосов
/ 26 мая 2011

У меня есть двоичный файл << "a, b, c" >>, и я хотел бы извлечь информацию из этого двоичного файла.

Так что я хотел бы иметь что-то вроде A = a, B = b и так далее.Мне нужен общий подход к этому, потому что двоичная строка всегда меняется.Так что это может быть << "aaa", "bbb", "ccc" >> ...

Я попытался создать список

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

но в результате я получаю строку.

"abc"

Спасибо.

1 Ответ

13 голосов
/ 26 мая 2011

Вы использовали правильный метод.

binary_to_list (Binary) -> [char ()]

Возвращает список целых чисел, которые соответствуютбайт двоичного.

В Erlang нет типа строки: http://www.erlang.org/doc/reference_manual/data_types.html#id63119. Консоль просто отображает списки в строковом представлении в качестве любезности, если все элементы находятся в диапазоне ASCII для печати.

Вы должны прочитать документацию Эрланга "Битовые синтаксические выражения" , чтобы понять, как работать с двоичными файлами.

Не преобразовывайте весь двоичный файл в список, если он вам не нужен в представлении списка!

Чтобы извлечь первые три байта, вы можете использовать

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

Если вы хотите перебрать двоичные данные, вы можете использовать двоичное понимание.

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

Также возможно сопоставление с образцом:

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

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

Даже для чтенияодин символ UTF-8 одновременно.Чтобы преобразовать двоичную строку UTF-8 в формат "списка кодовых точек" Эрланга, вы можете использовать:

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">>, "").

(обратите внимание, что `<<"aaa","bbb","ccc">> = <<"aaabbbccc">>. На самом деле не используйтепоследний код пропущен, но связанный метод.)

...