2012-02-24 18 views
15

Ho un programma di erlang che genera dati. Questi dati devono essere trasferiti tramite udp a un programma non-erlang per ulteriori elaborazioni. Ho già questa parte di lavoro - l'invio dei dati tramite udp e la ricezione sull'altro lato non-erlang.Converti i termini di erlang in stringa, o decodifica il binario di erlang

Ecco il problema. I dati (termini di erlang come tuple che contengono liste) non sembrano in grado di andare "così com'è" (cioè non posso semplicemente inviare termini arbitrari di erlang). Apparentemente ha bisogno di essere convertito prima in testo o in binario. La conversione in binario sembra abbastanza semplice con un bif che ho trovato. Il problema è che il gobbledygook binario esce dall'altra parte e non conosco un modo semplice per decodificarlo (l'altro lato è non-erlang).

Blocco qualcuno mi dice qualche modo semplice per decodificare gobbledygook binario dall'altra parte, vorrei i dati da inviare come una rappresentazione semplicistica serie di termini - ad esempio, una tupla come questo:

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

inviato in questo modo:

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

non ho visto una tale BIF, vale a dire "convert_term_to_ascii/1", ecc so che avrei potuto eseguire la scansione e inviare rappresentazioni simboliche dei termini, ma non voglio per farlo, decifrare che dall'altra parte è solo un dolore che non voglio trattare con.

So che non sono la prima, seconda o terza persona ad avere questo problema. Deve essere abbastanza comune. Come viene normalmente trattato?

Qualcuno può indicarmi qualche risorsa indicandomi come 1) convertire il gobbledygook binario in ascii (necessario sul lato non-erlang), o 2) convertire i termini in una stringa (necessaria sul lato erlang)?

Oppure, dimmi come mi sbaglio e come dovrei farlo davvero?

Grazie.

risposta

26

1) è possibile convertire qualsiasi termine di stringa utilizzando

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

2) si potrebbe guardare Erlang formato binario esterno, un sacco di altre lingue hanno librerie per la codifica/decodifica che il formato file binari Erlang. E in erlang puoi codificare qualsiasi termine per term_to_binary

+0

Si è appena verificato un problema correlato, convertendo un binario o una stringa del modulo che sarebbe stato un input valido per il file: consultare/1 in termini Erlang, ma non partire da un file. Ho deciso di documentare la soluzione per il mio futuro io, forse altri lo troveranno utile: http://zxq9.com/archives/1354 – zxq9

2

Suggerirei di convertire i termini di erlang in JSON, con una delle due librerie conosciute (ho sentito parole buone riguardo a rfc4267). Sarebbe un compito banale convertire nuovamente JSON con qualsiasi piattaforma non-erlang, immagino.)

+1

Un'altra libreria Erlang JSON che vale la pena guardare è jsx - Io uso questo per tutti i server Erlang -> C++ client stuff ed è veloce, affidabile e facile da usare. – Seb

+0

Prima di decidere su JSON, tenere presente che non esiste alcuna associazione tra i tipi Erlang e JSON. In particolare, JSON (e YAML) mancano di atomi, una rappresentazione diretta di dati binari, e una distinzione tra numeri-come-stringhe (e all'interno di tale float rispetto all'intero). Devi scegliere un formato intermedio o una traduzione schematica per distinguere le stringhe dai binari dalle liste e gli atomi dalle stringhe, e ogni lib JSON lo farà in modo leggermente diverso. I termini BIF 'term_to_binary/1' <->' binary_to_term/1' sono esatti e funzionano anche con le librerie BERT (http://bert-rpc.org/) per varie lingue. – zxq9