我编写了一个有效的函数,将二进制文件拆分为每个char,但我觉得有一种更简单的方法:
my_binary_to_list(<<H,T/binary>>) ->
%slightly modified version of http://erlang.org/doc/efficiency_guide/binaryhandling.html
[list_to_binary([H])|my_binary_to_list(T)];
my_binary_to_list(<<>>) -> [].
> my_binary_to_list(<<"ABC">>).
[<<"A">>,<<"B">>,<<"C">>]
Run Code Online (Sandbox Code Playgroud)
我认为这可能是凌乱的,list_to_binary([H])
因为因为H
应该已经是二进制了.
我尝试直接使用该链接功能,但得到的"AA"
不是我想要的.然后我尝试了,[H]
并得到了["A","B","C"]
这也不是我想要的.
您可以从单个字节创建二进制文件而无需创建列表并list_to_binary
像这样调用:
my_binary_to_list(<<H,T/binary>>) ->
[<<H>>|my_binary_to_list(T)];
Run Code Online (Sandbox Code Playgroud)
您还可以在此处使用二进制推导来在一行中执行与上述相同的逻辑:
1> [<<X>> || <<X>> <= <<"ABC">>].
[<<"A">>,<<"B">>,<<"C">>]
Run Code Online (Sandbox Code Playgroud)
您也可以直接提取大小为1的二进制文件(虽然这可能不比上面快):
2> [X || <<X:1/binary>> <= <<"ABC">>].
[<<"A">>,<<"B">>,<<"C">>]
Run Code Online (Sandbox Code Playgroud)
编辑:快速工作台使用timer:tc/1
第二代码运行大约一半的时间与第一代码相比,但是出于性能原因,您应该在使用其中任何一个之前对自己进行基准测试.也许第二个是通过创建子二进制文件来共享大二进制文件?
1> Bin = binary:copy(<<"?">>, 1000000).
<<"????????????????????????????????????????????????????????????????????????????????????????????????????????????????????"...>>
2> timer:tc(fun() -> [<<X>> || <<X>> <= Bin] end).
{14345634,
[<<"?">>,<<"?">>,<<"?">>,<<"?">>,<<"?">>,<<"?">>,<<"?">>,
<<"?">>,<<"?">>,<<"?">>,<<"?">>,<<"?">>,<<"?">>,<<"?">>,
<<"?">>,<<"?">>,<<"?">>,<<"?">>,<<"?">>,<<"?">>,<<"?">>,
<<"?">>,<<"?">>,<<"?">>,<<"?">>,<<"?">>,<<...>>|...]}
3> timer:tc(fun() -> [X || <<X:1/binary>> <= Bin] end).
{7374003,
[<<"?">>,<<"?">>,<<"?">>,<<"?">>,<<"?">>,<<"?">>,<<"?">>,
<<"?">>,<<"?">>,<<"?">>,<<"?">>,<<"?">>,<<"?">>,<<"?">>,
<<"?">>,<<"?">>,<<"?">>,<<"?">>,<<"?">>,<<"?">>,<<"?">>,
<<"?">>,<<"?">>,<<"?">>,<<"?">>,<<"?">>,<<...>>|...]}
Run Code Online (Sandbox Code Playgroud)