Erlang如何从这个二进制<<"a,b,c">>创建一个列表

And*_*eas 7 string binary erlang list

我有一个二进制<<"a,b,c">>,我想从这个二进制文件中提取信息.

所以我希望有类似A = a,B = b等的东西.我需要一个通用的方法,因为二进制字符串总是会改变.所以它可能是<<"aaa","bbb","ccc">> ......

我试着生成一个列表

二郎:binary_to_list(<< "一", "B", "C" >>)

但结果却得到了字符串.

"ABC"

谢谢.

kay*_*kay 16

你确实使用了正确的方法.

binary_to_list(二进制) - > [char()]

返回与二进制字节对应的整数列表.

Erlang中没有字符串类型:http://www.erlang.org/doc/reference_manual/data_types.html#id63119.如果所有元素都在可打印的ASCII范围内,控制台只会以字符串形式显示列表.

您应该阅读Erlang的"位语法表达式"文档,以了解如何处理二进制文件.

如果您不需要列表表示,请不要将整个二进制文件转换为列表!

要提取您可以使用的前三个字节

<<A, B, C, Rest/binary>> = <<"aaa","bbb","ccc">>.
Run Code Online (Sandbox Code Playgroud)

如果要迭代二进制数据,可以使用二进制理解.

<< <<(F(X))>> || <<X>> <= <<"aaa","bbb","ccc">> >>.
Run Code Online (Sandbox Code Playgroud)

模式匹配也是可能的:

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

882 = test(<<"aaa","bbb","ccc">>, 0).
Run Code Online (Sandbox Code Playgroud)

即使是一次读取一个UTF-8字符.因此,要将二进制UTF-8字符串转换为Erlang的"代码点列表"格式,您可以使用:

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">>, "").
Run Code Online (Sandbox Code Playgroud)

(注意:`<<"aaa","bbb","ccc">> = <<"aaabbbccc">>实际上不要使用剪切的最后一个代码,而是使用链接的方法.)