2012-02-24 35 views
15

Tôi có một chương trình xóa dữ liệu tạo ra dữ liệu. Dữ liệu này cần được chuyển qua udp sang một chương trình không xóa để xử lý tiếp. Tôi đã có phần này làm việc - gửi dữ liệu qua udp và nhận dữ liệu ở phía bên kia không phải là khía cạnh khác.Chuyển đổi thuật ngữ erlang thành chuỗi, hoặc giải mã nhị phân erlang

Đây là vấn đề. Dữ liệu (các thuật ngữ erlang như tuples chứa danh sách) dường như không thể đi qua "nguyên trạng" (nghĩa là tôi không thể chỉ gửi các thuật ngữ erlang tùy ý). Nó dường như cần phải được chuyển đổi sang văn bản hoặc nhị phân đầu tiên. Chuyển đổi sang nhị phân có vẻ dễ dàng đủ với một bif tôi tìm thấy. Vấn đề là, gobbledygook nhị phân đi ra phía bên kia, và tôi không biết bất kỳ cách nào dễ dàng để giải mã nó (phía bên kia là non-erlang).

Trừ một ai đó nói với tôi một số cách dễ dàng để giải mã nhị phân gobbledygook ở phía bên kia, tôi muốn các dữ liệu được gửi dưới dạng một đại diện đơn giản chuỗi các điều khoản - ví dụ một tuple như thế này:

{[1,2,3],[4,5,6]} 

gửi như thế này:

"{[1,2,3],[4,5,6]}" 

tôi chưa thấy bất kỳ bif như vậy, tức là "convert_term_to_ascii/1" vv tôi biết tôi có thể quét nó và gửi cơ quan đại diện dấu chỉ về sự điều khoản, nhưng tôi không muốn để làm điều đó - giải mã mà ở phía bên kia chỉ là một nỗi đau tôi không muốn đối phó với.

Tôi biết tôi không phải là người đầu tiên, thứ hai hoặc thứ ba có vấn đề này. Nó phải khá phổ biến. Nó thường được xử lý như thế nào?

Ai đó có thể chỉ cho tôi một số tài nguyên cho tôi biết cách 1) chuyển đổi gobbledygook nhị phân thành ascii (cần thiết ở phía bên không), hoặc 2) chuyển thẳng từ khóa sang chuỗi (cần ở bên erlang)?

Hoặc, cho tôi biết tôi sai và cách tôi thực sự nên thực hiện việc này?

Cảm ơn.

Trả lời

26

1) bạn có thể chuyển đổi bất kỳ điều khoản để sử dụng chuỗi

R= io_lib:format("~p",[yourtermhere]), 
lists:flatten(R) 

2) bạn có thể nhìn vào erlang định dạng nhị phân bên ngoài, rất nhiều ngôn ngữ khác có thư viện cho bộ mã hóa/giải mã rằng định dạng nhị phân erlang. Và trong erlang, bạn có thể mã hóa bất kỳ thuật ngữ nào bằng cách sử dụng term_to_binary

+0

Chỉ cần chạy vào một vấn đề liên quan, chuyển đổi một nhị phân hoặc chuỗi của biểu mẫu sẽ là đầu vào hợp lệ cho tệp: tham khảo/1 vào các thuật ngữ Erlang, nhưng không bắt đầu từ một tệp. Tôi quyết định ghi lại giải pháp cho bản thân tương lai của mình, có thể những người khác sẽ thấy nó hữu ích: http://zxq9.com/archives/1354 – zxq9

2

Tôi khuyên bạn nên chuyển đổi các thuật ngữ xóa thành JSON, với một trong hai thư viện đã biết (nghe các từ tốt về số rfc4267). Nó sẽ là một nhiệm vụ tầm thường để chuyển đổi JSON trở lại với bất kỳ nền tảng non-erlang, tôi đoán.)

+1

Thư viện JSON Erlang khác có giá trị là jsx - tôi sử dụng nó cho tất cả các máy chủ Erlang -> C++ và nhanh chóng, đáng tin cậy và dễ sử dụng. – Seb

+0

Trước khi quyết định JSON, hãy nhớ rằng không có ánh xạ giữa các loại Erlang và JSON. Đặc biệt, JSON (và YAML) thiếu các nguyên tử, một biểu diễn trực tiếp của dữ liệu nhị phân, và một sự phân biệt giữa các số-như-chuỗi (và trong đó float so với số nguyên). Bạn phải chọn một định dạng trung gian hoặc bản dịch sơ đồ để phân biệt các chuỗi từ các tệp nhị phân khỏi danh sách và các nguyên tử từ các chuỗi và mỗi lib JSON sẽ thực hiện một cách khác nhau. BIF 'term_to_binary/1' <->' binary_to_term/1' là chính xác và cũng làm việc với các thư viện BERT (http://bert-rpc.org/) cho các ngôn ngữ khác nhau. – zxq9

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