2016-04-19 80 views
5

我正在使用tcp連接將數據發送到C++服務器。我已經閱讀過關於ei庫,當給出一個二進制文件時,它有一堆函數可以從二進制文件中獲得解碼值。 Egs,ei_decode_string,ei_decode_long等。在erlang和C++之間發送數據

我想要做這些簡單的事情:
1.創建一個套接字並連接到它。

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

2.使用gen_tcp:send/2來發送數據。

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

因此,我將一個字符串的二進制格式發送到服務器。

我的服務器,C++代碼,獲取數據,我試圖讓任何客戶端發送我在使用ei_decode_string像插座:

理想的情況下,解碼時,我應該找回字符串,「#1」,因爲我告訴它來自binary的decode_as_string。確保我在緩衝區中有足夠的空間。

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; 

我無法解碼我發送的字符串。我錯過了什麼嗎?如果這不是正確的方法,我如何在服務器端發送數據並對其進行解碼。

謝謝你的幫助!

+0

想通了,但這只是一個tweek。我可以看到,在服務器端,我收到一個額外的問號(?),如果我通過緩衝區跳過該結構,ei_decode_string工作正常。但不知道,爲什麼我得到額外的問號(?)。 – listen

+0

我想'binary_to_list(term_to_binary(「Stackoverflow」))'不能正常工作 – Lol4t0

+1

爲了正確,清晰的答案:如果想要將字符串轉換爲表示該字符串的字符的二進制文件,應該使用['list_to_binary/1'](http://erlang.org/doc/man/erlang.html#list_to_binary-1)。當收件人需要[Erlang外部術語格式](http://erlang.org/doc/apps/erts/erl_ext_dist.html)中的數據時,應使用'term_to_binary'。 –

回答

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

在這裏,在二進制中的第一項是不字符串作爲小的整數,但如在External Term Format描述的版本號(131)。之後,每個條件都以標籤爲前綴,然後是相應的數據。在這種情況下,標籤107 STRING_EXT,兩個字節的長度(13),然後是13個8位整數,第一個83對應字母'S'(ascii爲83)。

要正確正確處理這個二進制文件,打電話ei_decode_version必須是以前ei_decode_string

INT ei_decode_version(爲const char * buf中,INT *指數,詮釋*版本)

此功能的版本進行解碼erlang二進制 術語格式的幻數。它必須是二進制術語中的第一個標記。