0

私はostringstreamを構築しています。

int私はこのストリームに s を書いていました。

私はstream<<" ";2つの番号の間で使用しています。このストリームを文字列に変換し、UDP で送信します。

受信側では、これらの関数を使用して、文字列を " " スペース文字で個々の数字に分割しています。

std::vector<std::string> split(const std::string &s, char delim) {
    std::vector<std::string> elems;
    split(s, delim, elems);
    return elems;
}


std::vector<std::string> &split(const std::string &s, char delim, std::vector<std::string> &elems) {
    std::stringstream ss(s);
    std::string item;
    while (std::getline(ss, item, delim)) {
        elems.push_back(item);
    }
    return elems;
}

ここでバイナリデータを書きたいので
、 write 関数を使用してバイナリデータを書きます。たとえば、ここのデータ構造です ( http://robot.kaist.ac.kr/haptics/chai3d-2.0.0_Doc/resources/html/structc_matrix3d .html )

void  insert_into_stream(std::ostream& stream, const cMatrix3d rot)
{
    cVector3d column; 
    unsigned int byteCounter = 0;
    int length = sizeof(double)*3;
    char insert_buffer[sizeof(double)*9];

    column  = rot.getCol0();
    memcpy(insert_buffer, &column[0], length);
    stream.write(insert_buffer, length);
    byteCounter += length;

    column  = rot.getCol1();
    memcpy(insert_buffer+byteCounter, &column[0], length);
    stream.write(insert_buffer, length);
    byteCounter += length;

    column  = rot.getCol2();
    memcpy(insert_buffer+byteCounter, &column[0], length);
    stream.write(insert_buffer, length);
}

ストリームに追加し、各エントリをスペース文字で区切ります。

このようなデータ構造を 15 個追加し、レシーバー側で分割メソッドを使用すると、バイナリ データ自体に ASCII スペース文字が含まれている可能性があるため、データによっては 15 個以上の文字列 (例: 18 個) を取得する場合があるため、これはうまく機能しません。その中。少なくともそれが問題だと思います。

この問題を解決するには?

---編集---- 最初に特定の int を追加した後、これらの 15 のデータ構造をストリームに追加するため、分割メソッドを使用してこれらの初期番号を取得する必要があります。

4

2 に答える 2

2

バイナリ データを送信する場合は、「区切り文字」を使用しない/必要としません。各サイズで書き込みと読み取りに必要なバイト数がわかります。たとえば、数値が type のuint32_t場合、これらはストリームから 4 バイトになります。

しかし、あなたの編集から、より複雑なデータ構造をデシリアライズ/シリアル化するためのメカニズムが必要になることがわかります。Google Protocol Buffersなど、より適切なプロトコルを使用することをお勧めします。

于 2013-07-16T15:45:15.867 に答える