Erlang:在每个char上拆分二进制文件

Tom*_*mmy 3 erlang

我编写了一个有效的函数,将二进制文件拆分为每个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"]这也不是我想要的.

Dog*_*ert 8

您可以从单个字节创建二进制文件而无需创建列表并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)