2009-03-01 32 views
46

Làm cách nào để ghép nối hai tệp nhị phân trong Erlang?Làm cách nào để ghép nối hai tệp nhị phân trong Erlang?

Ví dụ, giả sử tôi có:

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

Làm thế nào để nối B1 và ​​B2 để tạo ra một B3 nhị phân mà là < < 1,2,3,4 >>?

Lý do tôi yêu cầu điều này là vì tôi đang viết mã để mã hóa gói cho một số giao thức mạng. Tôi đang thực hiện điều này bằng cách viết bộ mã hóa cho các trường trong gói và tôi cần ghép các trường đó để xây dựng toàn bộ gói.

Có lẽ tôi đang làm điều này sai. Tôi có nên xây dựng các gói tin như là một danh sách các số nguyên và chuyển đổi danh sách sang một nhị phân tại thời điểm cuối cùng?

Trả lời

31

Câu trả lời là không. gen_tcp: send sẽ chấp nhận danh sách sâu. Vì vậy, ghép nối chỉ đơn giản là:

B3 = [B1, B2]. 

Đây là O (1). Nói chung, khi giao dịch với loại dữ liệu này luôn xây dựng các cấu trúc danh sách sâu và để cho các thói quen io đi bộ cấu trúc ở đầu ra. Biến chứng duy nhất là bất kỳ thói quen trung gian nào cũng sẽ chấp nhận danh sách sâu.

+0

Cảm ơn! Tôi không quen với các khái niệm về danh sách sâu và danh sách io trong Erlang. –

+21

Tôi không có mã này đúng. Nó trả về: '[<<1,2>>, <<3,4>>]' và đây không phải là những gì @Cayle Spandon yêu cầu. Vì vậy, câu trả lời là sai. – Worker

+2

@Worker - câu trả lời mà cthulahoops đưa ra không nhằm mục đích thực sự nối hai tập tin nhị phân. Điểm của câu trả lời này là bạn có thể tránh chi phí tính toán của việc ghép nối hai tập tin nhị phân ở nơi đầu tiên, nếu mã bạn đang làm việc với sẽ chấp nhận iolists. Vì người hỏi ban đầu nói rằng họ đang cố gắng xây dựng một gói mạng, câu trả lời này cho thấy rằng có thể ghép hai tập tin nhị phân không thực sự là cách tốt nhất để đạt được những gì mà người hỏi ban đầu cần. – Nick

112
28> B1= <<1,2>>. 
<<1,2>> 
29> B2= <<3,4>>. 
<<3,4>> 
30> B3= <<B1/binary, B2/binary>>. 
<<1,2,3,4>> 
31> 
+0

Có lẽ đây không phải là một hoạt động O (1), do đó vẫn có ý nghĩa để xây dựng danh sách sâu (danh sách IO) đề nghị bởi cthulahoops và trì hoãn đi bộ danh sách sâu cho đến khi tôi đã sẵn sàng để gửi các gói tin? –

+15

Cả hai câu trả lời đều tốt. Cấu trúc 'io_list' từ cthulahoops là lý tưởng cho i/o; tuy nhiên vì đây là hit hàng đầu của google cho "các tập tin nhị phân nối", thật tuyệt khi có câu trả lời đúng ở đây. – JasonSmith

12

Để xây dựng dựa trên câu trả lời cuối cùng:

bjoin(List) -> 
    F = fun(A, B) -> <<A/binary, B/binary>> end, 
    lists:foldr(F, <<>>, List). 
+0

điều này rất hay! – Tommy

13

Để sử dụng một io_list, bạn có thể làm:

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

Đó là tốt đẹp và dễ đọc. Bạn cũng có thể sử dụng danh sách và những thứ trong đó nếu nó thuận tiện hơn.

Các vấn đề liên quan