2016-04-19 39 views
5

Używam połączenia TCP do wysyłania danych do serwera C++. Czytałem o bibliotece ei, która po podaniu binarnej ma garść funkcji, aby uzyskać dekodowaną wartość z binarnego. Egs, ei_decode_string, ei_decode_long i inne.wysyłanie danych między erlang i C++

Próbuję wykonać te proste czynności:
1. Utwórz gniazdo i połącz się z nim.

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

2. Użyj polecenia gen_tcp: send/2, aby wysłać dane.

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

Dlatego wysyłam do serwera format binarny ciągu znaków.

mojego serwera, kod C++, pobiera dane i staram się dostać cokolwiek klient wysyła mnie na gnieździe przy użyciu ei_decode_string jak:

Najlepiej, gdy dekodowany powinienem wrócić ciąg „stackoverflow” Od Powiedziałem, żeby dekodować_as_string z pliku binarnego. Upewniłem się, że mam wystarczająco dużo miejsca w wynikowym buforze.

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; 

Nie mogę rozszyfrować ciągu, który wysłałem.! Czy czegoś brakuje? Jak mogę wysyłać dane i dekodować je po stronie serwera, jeśli nie jest to właściwe podejście.

Dziękuję za pomoc!

+0

zorientował się, ale to tylko tweek. Widzę, że po stronie serwera otrzymuję dodatkowy znak zapytania (?) I jeśli przekażę bufor pomijając tego charectera, ei_decode_string działa dobrze. ale nie jestem pewien, dlaczego otrzymuję ten dodatkowy znak zapytania (?). – listen

+0

Przypuszczam, że ten sam powód, jak 'binary_to_list (term_to_binary (" Stackoverflow "))' nie działa zgodnie z oczekiwaniami – Lol4t0

+1

Aby uzyskać poprawną, jasną odpowiedź: jeśli chcesz przekonwertować ciąg znaków na binarny reprezentujący znaki tego ciągu, jeden powinien użyć ['list_to_binary/1'] (http://erlang.org/doc/man/erlang.html#list_to_binary-1). 'term_to_binary' powinno być używane, gdy adresat oczekuje danych w formacie zewnętrznym Erlanga (http://erlang.org/doc/apps/erts/erl_ext_dist.html). –

Odpowiedz

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

Oto pierwsza pozycja w binarnym nie jest ciąg liczb jako małe, ale numer wersji (131), jak opisano w External Term Format. Następnie przychodzą terminy z prefiksem znacznika, a następnie odpowiednimi danymi. W tym przypadku znacznik 107 STRING_EXT, dwa bajty dla długości (13), a następnie 13 8bitowych liczb całkowitych, pierwszy 83 odpowiada literę "S" (83 w ascii).

Aby obsługiwać ten binarny poprawnie poprawnie, należy zadzwonić do ei_decode_version musi być przed ei_decode_string

int ei_decode_version (const char * buf, int * indeksu int * wersja)

Funkcja ta dekoduje wersję magiczna liczba dla binarnego formatu erlang . To musi być pierwszy token w binarnym terminie.

Powiązane problemy