如何連接Erlang中的兩個二進制文件?如何連接Erlang中的兩個二進制文件?
例如,假設我有:
B1 = <<1,2>>.
B2 = <<3,4>>.
如何串聯B1和B2,以創建一個二進制B3是< < 1,2,3,4 >>?
我問這個問題的原因是因爲我正在編寫代碼來編碼某個網絡協議的數據包。我通過爲數據包中的字段編寫編碼器來實現這一點,我需要連接這些字段來構建整個數據包。
也許我這樣做是錯誤的。我是否應該將數據包構建爲整數列表,並在最後時刻將列表轉換爲二進制文件?
如何連接Erlang中的兩個二進制文件?如何連接Erlang中的兩個二進制文件?
例如,假設我有:
B1 = <<1,2>>.
B2 = <<3,4>>.
如何串聯B1和B2,以創建一個二進制B3是< < 1,2,3,4 >>?
我問這個問題的原因是因爲我正在編寫代碼來編碼某個網絡協議的數據包。我通過爲數據包中的字段編寫編碼器來實現這一點,我需要連接這些字段來構建整個數據包。
也許我這樣做是錯誤的。我是否應該將數據包構建爲整數列表,並在最後時刻將列表轉換爲二進制文件?
答案是沒有。 gen_tcp:send將接受深度列表。因此,級聯很簡單:
B3 = [B1, B2].
這是O(1)。一般來說,處理這類數據時總會建立深層的列表結構,並讓輸入的io例程遍歷結構。唯一的問題是任何中間例程都會接受深度列表。
使用Erlang的功能list_to_binary(列表),你可以在這裏找到的文檔: http://www.erlang.org/documentation/doc-5.4.13/lib/kernel-2.10.13/doc/html/erlang.html#list_to_binary/1
28> B1= <<1,2>>.
<<1,2>>
29> B2= <<3,4>>.
<<3,4>>
30> B3= <<B1/binary, B2/binary>>.
<<1,2,3,4>>
31>
要建立的最後一個答案:
bjoin(List) ->
F = fun(A, B) -> <<A/binary, B/binary>> end,
lists:foldr(F, <<>>, List).
要使用io_list,你可以這樣做:
erlang:iolist_to_binary([<<"foo">>, <<"bar">>])
這是很好的和清晰的。如果更方便,您還可以使用列表和內容。
謝謝!我不熟悉Erlang深層列表和io列表的概念。 – 2009-03-02 00:51:47
我不是這個代碼是正確的。它返回:`[<<1,2>>,<<3,4>>],這不是@Cayle Spandon所要求的。所以答案是錯的。 – Worker 2012-02-16 12:02:30
@Worker - cthulahoops給出的答案並不是要實際連接兩個二進制文件。這個答案的重點在於,如果您正在使用的代碼將接受iolist,那麼您可以避免首先連接兩個二進制文件的計算成本。由於最初的提問者說他們試圖構建一個網絡數據包,這個答案表明,也許連接這兩個二進制文件並不是真正實現原始提問者所需要的最好方式。 – Nick 2016-02-05 19:18:31