0

我正在建立一个ostringstream。

我正在写int这个流。

stream<<" ";在两个数字之间使用。我将此流转换为字符串并通过 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;
}

现在我想写二进制数据,所以
我用写函数写二进制数据,例如这里的数据结构(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 个这样的数据结构,然后在接收端使用 split 方法,这取决于我有时会得到超过 15 个字符串(例如 18 个)的数据,因为二进制数据本身可能具有 ascii 空格字符在里面。至少这就是我认为的问题所在。

如何解决这个问题呢?

---edit--- 我在一个流中添加这15个数据结构,在我开始添加某些int之后,所以我需要使用split方法来获取这些初始数字。

4

2 回答 2

2

如果发送二进制数据,您将不需要/不需要“分隔符”。您将知道在每种大小下写入和读取需要多少字节。例如,如果您的数字是 type uint32_t,这些将是流中的四个字节。

但是我从您的编辑中看到,您需要一些机制来反序列化更复杂的数据结构。我建议为此使用一些更合适的协议,例如Google Protocol Buffers

于 2013-07-16T15:45:15.867 回答
0

有几个问题。最直接的是您正在输出固定长度的二进制数据,但试图在输入时将其解析为可变长度(部分)文本数据。通常,二进制浮点将具有固定长度(但它取决于二进制格式,我知道有例外)。二进制整数数据通常也具有固定长度,但可变长度并不罕见(例如 Google 的协议块)。

第二个也是更普遍的问题是您只是将位转储到输出流中,没有任何格式。这意味着在未来的某个时候,您几乎肯定无法重新阅读它们。如果您将数据溢出到磁盘,则此技术很好,因为它不适合内存,并且稍后只能由同一进程重新读取数据。否则,您需要定义一种格式,并根据它定义的内容输出(和输入)。(有一个原因为什么istream::readand ostream::writetake char*,而不是void*。)

于 2013-07-16T16:18:28.440 回答