2017-11-09 8 views
1

私は自分のprotobuf-messageを設定しているようですが、他のすべてのフィールドはネットワーク上で正しく送信され、切り捨てられません。私は、画像やファイルのバイナリデータを読み込んで、それをバイト配列型としてGoogleのprotobufを介して送信すると、配列の最初の4つの要素しか含まないという問題が1つしかありません。画像が200kbと言うと、もう一方の端では1kb(基本的にヘッダーまたは識別子のみが含まれています)として表示されます。この問題はちょっと複雑なので、私は逃げようとします。私はこれを理解することが不可能になる場合は申し訳ありません。私はこれについて完全に間違った方向に行くかもしれない。Googleを介してバイナリファイルデータを送信するProtobuf

  1. 以下の例は、概念的な作業を含み、クラスで書かれています。それは小さな誤差を含んでいる可能性が非常に高いです。コードは自宅でコンパイルされますが、それがタイプミスであれば教えてください。修正することができます。

    FILE* file; 
        FILE* ofile; 
        file = fopen("red.png", "rb"); 
        fseek(file, 0, SEEK_END); 
        long fSize = ftell(file); 
        rewind(file); 
        BYTE* ret = new BYTE[fSize]; 
        fread(ret, 1, fSize, file); 
        fclose(file); 
    
        char dataStream[1024] //yes it is large enough 
        myPacket.set_file(ret); 
        //set other fields here 
        myPacket.SerializeToArray(dataStream,sizeof(dataStream)); 
        //send through sockets below, works for all but file field. 
    

    私は私のメインの仕事用のコンピュータに戻って家に帰るとき、私はそれ以上を含むことができ、申し訳ありませんが、ちょうど私がクラスでこのシチューながらしてみましょう可能性が期待していました。これで十分ではない情報が私に叩くことを自由に感じたら、それはちょうど助言を探しているだけです。私はまた、特定の画像フォーマットは、特定の方法を読み取ることができることを知っているが、が、私は私の擬似帳みんなを読むためだけではないいるProtobuf上、

感謝をPNGをコピーして、ローカルバイナリを通してそれを書き換えることができた、Iついに私の知識を向上させるために飛躍しようとしています。

(ret)にすばやくタイプされたポインタエラー(& ret)が編集されました。また、サイズはsizeof(myPacket)にする必要があります。

+1

'ret'、あなたの画像データへのポインタ、および'&ret'、あなたの変数へのポインタの違いを考えてみましょう。そして、 'sizeof(dataStream)'は1024です。 – molbdnilo

+0

s/'myPacket.set_file(&ret);'/'myPacket.set_file(ret);' – user0042

+0

ポインタ部分が誤っていたので、サイズが問題です。 – Wilky

答えて

1

あなたは書かれている本:

char dataStream[1024] //yes it is large enough 

しかし、あなたがそれに200の000バイトを保存したい場合はどのように1024バイトのバッファが十分な大きさだろうか?

ベター例えば、ヒープ上に大きなバッファを割り当てる:

std::vector<char> dataStream(500000); 
myPacket.SerializeToArray(&dataStream[0], dataStream.size()); 
+0

完全に遅くなった、修正していただきありがとうございます。 – Wilky

関連する問題