2016-04-19 10 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使用してソケットの上に私を送り、何でも取得しようとしています:

理想的には、デコードされたときに私は、文字列を取り戻す必要があり、「StackOverflowの」以来、私はバイナリから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

これはわかりましたが、それはちょうど双子です。私はサーバー側で余分な疑問符(?)を受け取っていることがわかります。そして、そのcharecterをスキップするバッファを渡すと、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 external term format](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は2バイトの長さ(13)、次に13個の8ビット整数、最初の1つは83文字に対応します(アスキーでは83文字)。 ei_decode_versionに呼び出して、正しく正しく、このバイナリを処理するために

ei_decode_string

int型ei_decode_version(定数するchar * bufに、int型*インデックス、int型*バージョン)

前である必要があります。この機能は、バージョンをデコードerlangバイナリのマジックナンバー の用語フォーマット。バイナリ用語の最初のトークンでなければなりません。

関連する問題