代码之家  ›  专栏  ›  技术社区  ›  Bruno Rijsman

如何在Erlang中连接两个二进制文件?

  •  55
  • Bruno Rijsman  · 技术社区  · 17 年前

    如何在Erlang中连接两个二进制文件?

    B1 = <<1,2>>.
    B2 = <<3,4>>.
    

    我如何将B1和B2连接起来以创建一个二进制B3;<1,2,3,4>>?

    我之所以问这个问题,是因为我正在编写代码,为某种网络协议对数据包进行编码。我通过为数据包中的字段编写编码器来实现这一点,我需要连接这些字段来构建整个数据包。

    5 回复  |  直到 17 年前
        1
  •  129
  •   Steve Kirsch Steve Kirsch    17 年前
    28> B1= <<1,2>>.
    <<1,2>>
    29> B2= <<3,4>>.
    <<3,4>>
    30> B3= <<B1/binary, B2/binary>>.
    <<1,2,3,4>>
    31>
    
        2
  •  38
  •   cthulahoops    5 年前

    您可以使用位语法连接二进制文件:

    1> B1 = <<1,2>>.
    <<1,2>>
    2> B2 = <<3,4>>.
    <<3,4>>
    3> B3 = <<B1/binary, B2/binary>>.
    <<1,2,3,4>>
    

    在许多情况下,特别是在数据要发送到网络的情况下,您可以通过构造io_list来避免连接。

    B3 = [B1, B2],
    gen_tcp:send(Socket, B3).
    

    这是O(1),因为它避免了复制任何二进制文件。 gen_tcp:send 将接受深度列表并遍历结构以获得输出。(双元素列表只需要很少的额外内存,因此内存开销很小。)

    在某些情况下(重复附加到同一个二进制文件),Erlang现在进行了优化,避免了复制附加到的二进制文件,因此使用io_lists可能不太重要: http://erlang.org/doc/efficiency_guide/binaryhandling.html#constructing-binaries


    历史笔记:我最初只建议使用io_list解决方案,很多评论者正确地指出我没有回答这个问题。希望现在已接受的答案是完整的。(11年后!)

        3
  •  20
  •   David N. Welton    12 年前

    要使用io_list,您可以执行以下操作:

    erlang:iolist_to_binary([<<"foo">>, <<"bar">>])
    

    这很好,也很清晰。如果更方便的话,你也可以使用列表和里面的东西。

        4
  •  13
  •   pommonico    16 年前

    在最后一个答案的基础上:

    bjoin(List) ->
        F = fun(A, B) -> <<A/binary, B/binary>> end,
        lists:foldr(F, <<>>, List).
    
        5
  •  8
  •   john nowlin    11 年前

    使用erlang函数list_to_binary(list),您可以在此处找到文档: http://www.erlang.org/documentation/doc-5.4.13/lib/kernel-2.10.13/doc/html/erlang.html#list_to_binary/1