2012-02-24 11 views
15

Tengo un programa erlang que genera datos. Esta información debe transferirse a través de udp a un programa que no sea Erlang para su posterior procesamiento. Ya tengo esta parte funcionando, enviando los datos a través de udp y recibiéndolos en el otro lado que no es erlang.Convertir términos de erlang a cadena o decodificar erlang binario

Aquí está el problema. Los datos (términos erlang como tuplas que contienen listas) no parecen poder repasar "tal cual" (es decir, no puedo enviar términos de erlang arbitrarios). Al parecer, debe convertirse primero en texto o binario. La conversión a binario parece bastante fácil con un bif que encontré. El problema es que el binary gobbledygook sale del otro lado, y no conozco ninguna forma fácil de decodificarlo (el otro lado no es erlang).

A menos que alguien me diga alguna manera fácil de decodificar gobbledygook binario en el otro lado, me gustaría que los datos que deben enviarse como una representación simplista de cadena de los términos - por ejemplo una tupla como esto:

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

envió la siguiente manera:

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

no he visto ninguna tales BIF, es decir, "convert_term_to_ascii/1", etc. sé que podría escanear y enviar representaciones simbólicas de los términos, pero no quiero hacer eso - descifrar eso del otro lado es solo un dolor que no quiero tratar con.

Sé que no soy la primera, segunda o tercera persona que tiene este problema. Tiene que ser bastante común. ¿Cómo se trata normalmente?

¿Alguien me puede indicar algún recurso que me muestre cómo 1) convertir el binario gobbledygook en ascii (necesario en el lado no erlang), o 2) convertir términos directamente en una cadena (necesaria en el lado erlang)?

O, dime cómo me equivoco y cómo debería estar realmente haciendo esto?

Gracias.

Respuesta

26

1) se puede convertir cualquier término de cadena usando

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

2) lo podría hacer en Erlang formato binario externo, una gran cantidad de otros idiomas tienen bibliotecas para codificar/decodificar ese formato binarios Erlang. Y en erlang puede codificar cualquier término por term_to_binary

+0

Acabo de encontrar un problema relacionado, convertir un binario o una cadena del formulario que sería una entrada válida para el archivo: consulte/1 en términos de Erlang, pero no a partir de un archivo. Decidí documentar la solución para mi yo futuro, tal vez otros lo encuentren útil: http://zxq9.com/archives/1354 – zxq9

2

Recomiendo convertir los términos de erlang en JSON, con cualquiera de las bibliotecas conocidas (se escuchan buenas palabras con respecto a rfc4267). Creo que sería una tarea trivial convertir JSON con una plataforma que no sea Erlang.)

+1

Otra biblioteca de Erlang JSON que vale la pena mirar es jsx - La utilizo para todo el servidor Erlang -> C++ cliente y es rápida, confiable y fácil de usar. – Seb

+0

Antes de tomar una decisión sobre JSON, tenga en cuenta que no hay correspondencia entre los tipos Erlang y JSON. En particular, JSON (y YAML) carece de átomos, una representación directa de datos binarios y una distinción entre números como cadenas (y dentro de ese flotante versus entero). Debe elegir un formato intermedio o una traducción esquemática para distinguir cadenas de binarios de listas y átomos de cadenas, y cada JSON lib lo hará de forma un poco diferente. Los BIFs 'term_to_binary/1' <->' binary_to_term/1' son exactos y también funcionan con las bibliotecas BERT (http://bert-rpc.org/) para varios idiomas. – zxq9