gpt4 book ai didi

c++ - 什么样的定界符用于序列化?

转载 作者:行者123 更新时间:2023-11-28 03:13:27 25 4
gpt4 key购买 nike

我正在构建一个 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;
}

现在想写二进制数据,所以
使用写入功能,我正在写入二进制数据,例如来自这里的数据结构 ( 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 空格字符。至少这就是我认为的问题所在。

如何解决这个问题?

---编辑----我在流中添加了这 15 个数据结构,在开始时添加了某些 int 之后,因此我需要使用 split 方法来获取这些初始数字。

最佳答案

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

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

关于c++ - 什么样的定界符用于序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17681023/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com