2016-11-03 31 views
1

我有以下代碼:系列化浮動向量的

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是浮動的一個載體,我怎麼能進行相應的序列化和反序列化?

非常感謝。

+0

我會發送大小,然後是原始數據。 –

+0

@ Jean-FrancoisFabre你可以舉個例子嗎? – Johnnylin

+0

@Johnnylin你真的需要發明自己的序列化嗎?爲什麼不使用已經全部用完的現有序列化庫?例如[Boost序列化](http://www.boost.org/doc/libs/1_62_0/libs/serialization/doc/index.html)。 –

回答

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; 
}