我有以下代码:
struct MsgDetectedTarget
{
int target_id;
float bbox[4]; // need to change
};
在序列化函数中:
void SerializeToArray(std::vector<char>& buffer, int& dst_len, void* pMsg, int len){
buffer.resize(HEADER_LENGTH + len);
// encode message header
char header[HEADER_LENGTH + 1] = "";
std::sprintf(header, "%8d", len);
std::memcpy(&buffer[0], header, HEADER_LENGTH);
// encode message body
std::memcpy(&buffer[0]+HEADER_LENGTH, reinterpret_cast<char*>(pMsg), len);
dst_len = HEADER_LENGTH + len;
}
如果MsgDetectedTarget中的数据bbox具有固定大小,则很容易进行序列化。
MsgDetectedTarget msg;
msg.target_id = 1;
msg.bbox[0] = 0;
msg.bbox[1] = 0;
msg.bbox[2] = 500;
msg.bbox[3] = 500;
std::vector<char> msgdata;
int destlen;
SerializeToArray(msgdata, destlen, &msg, sizeof(msg));
问题:
我想将MsgDetectedTarget中的bbox更改为float的向量,如何执行相应的序列化和反序列化?
非常感谢。
答案 0 :(得分:0)
如果您不能使用Boost序列化,您可以执行@ Jean-FrancoisFabre建议的操作。类似的东西:
void SerializeToArray(std::vector<char>& buffer, int& dst_len, MsgDetectedTarget* msg) {
size_t numFloats = msg->bbox.size();
auto len = sizeof(int) + sizeof(size_t) + sizeof(float)*numFloats;
buffer.resize(HEADER_LENGTH + len);
// encode message header
char header[HEADER_LENGTH + 1] = "";
std::sprintf(header, "%8d", len);
std::memcpy(&buffer[0], header, HEADER_LENGTH);
// encode target_id
std::memcpy(&buffer[0] + HEADER_LENGTH, static_cast<char*>(&msg->target_id), sizeof(int));
// encode numFloats
std::memcpy(&buffer[0] + HEADER_LENGTH + sizeof(int), static_cast<char*>(&numFloats), sizeof(size_t));
// encode the vector of float
std::memcpy(&buffer[0] + HEADER_LENGTH + sizeof(int) + sizeof(size_t),
static_cast<char*>(&bbox[0]), sizeof(float)*numFloats);
dst_len = HEADER_LENGTH + len;
}