2016-04-19 54 views
5

Sto utilizzando una connessione TCP per inviare dati a un server C++. Ho letto della libreria ei che, quando viene data una stringa, ha un sacco di funzioni per ottenere il valore decodificato dal binario. Egs, ei_decode_string, ei_decode_long e altri.invio di dati tra erlang e C++

Sto cercando di fare queste semplici cose:
1. creare un socket e connettersi ad esso.

{ok, Socket} = gen_tcp:connect({127,0,0,1}, 8986, []). 

2. Usa gen_tcp: invia/2 per inviare dati.

gen_tcp:send(Socket, term_to_binary("Stackoverflow")). 

Pertanto, sto inviando un formato binario di una stringa al server.

mio server, il codice C++, ottiene i dati e sto cercando di ottenere tutto ciò che il cliente mi manda sopra la presa con ei_decode_string come:

Idealmente, quando decodificato dovrei tornare la stringa, "StackOverflow" dal L'ho detto a decode_as_string dal binario. Mi sono assicurato di avere abbastanza spazio nel buffer risultante.

char *p = (char*)malloc(sizeof(char) * 100); 
int index = 0; 
int decoded = ei_decode_string(buff, &index, p); 
cout<<"The decoded value is "<<p<<endl; 

Non riesco a decodificare la stringa che ho inviato.! Mi sto perdendo qualcosa? Come posso inviare dati e decodificarli dal lato server, se questo non è l'approccio giusto.

Grazie per l'aiuto!

+0

capito, ma questo è solo un tweek. Posso vedere che sul lato server, sto ricevendo un punto interrogativo extra (?) E se passo il buffer saltando quel carattere, ei_decode_string funziona bene. ma non sono sicuro, perché sto ricevendo quel punto interrogativo in più (?). – listen

+0

Suppongo che la stessa ragione di 'binary_to_list (term_to_binary (" Stackoverflow "))' non funzioni come previsto – Lol4t0

+1

Per una risposta corretta, chiara: se si vuole convertire una stringa in un file binario che rappresenta i caratteri di quella stringa, uno dovrebbe usare ['list_to_binary/1'] (http://erlang.org/doc/man/erlang.html#list_to_binary-1). 'term_to_binary' dovrebbe essere usato quando il destinatario si aspetta dati in [formato di termine esterno Erlang] (http://erlang.org/doc/apps/erts/erl_ext_dist.html). –

risposta

0
1> term_to_binary("Stackoverflow"). 
<<131,107,0,13,83,116,97,99,107,111,118,101,114,102,108, 
    111,119>> 

Qui il primo elemento binario non è la stringa come piccoli interi, ma un numero di versione (131) come descritto in External Term Format. Dopo di che vengono i termini ciascuno prefisso da un tag e quindi i dati corrispondenti. In questo caso tag 107 STRING_EXT, due byte per la lunghezza (13) e poi 13 interi per 8 bit, il primo 83 corrisponde alla lettera "S" (83 in ascii).

gestire questa binario correttamente correttamente, chiamare per ei_decode_version deve essere prima ei_decode_string

int ei_decode_version (const char * buf, int * index, int * versione)

Questa funzione decodifica versione numero magico per il formato a termine di erlang binary . Deve essere il primo token in un termine binario.