【发布时间】:2014-11-04 20:43:22
【问题描述】:
这个问题很像
serialize any data type as vector<uint8_t> - use reinterpret_cast?
template <typename T>
inline void pack (std::vector< uint8_t >& dst, T& data) {
uint8_t * src = static_cast < uint8_t* >(static_cast < void * >(&data));
dst.insert (dst.end (), src, src + sizeof (T));
}
解压
template <typename T>
inline void unpack (vector <uint8_t >& src, int index, T& data) {
copy (&src[index], &src[index + sizeof (T)], &data);
}
我正在尝试将任何类型的数据打包到一个字节数组中。
q1 :我有使用 uint8_t* 的繁琐实现,我希望向量的选择是最好的。
q2:我无法使用上述函数正确打包 std::string。请让我知道上述函数在打包所有类型的数据类型方面有多舒服
请告诉我如何将 std::string 合并到上述解决方案中,即打包并将 std::string 合并到向量中
我要打包的数据类型:
所有 POD 标准::字符串 矢量本身..
外部问题:
我想把这样的类打包成一个字节数组
class StartPeerSessionRequest : public Request {
public:
StartPeerSessionRequest();
virtual ~StartPeerSessionRequest();
void composeRequestwithHardCodeValues();
vector<uint8_t> packRequestWithTemplate();
private:
uint16_t mProtocolVersion;
uint16_t mSessionFlags;
uint16_t mMaxResponseLength;
string mMake;
string mModel;
string mSerialNumber;
uint8_t mTrackDelay;
string mHeadUnitModel;
string mCarModelYear;
string mVin;
uint16_t mVehicleMileage;
uint8_t mShoutFormat;
uint8_t mNotificationInterval;
};
class Message {
public:
Message();
virtual ~Message();
void composeMessage(vector<uint8_t> data, uint16_t opcode, uint16_t lengthOfData);
uint16_t packetheader;
uint16_t length;
uint16_t request_response_id;
uint16_t opcode;
uint16_t checksum;
vector<uint8_t> data;
}
我选择的字节数组数据类型是vector(uint8_t)
我想将它写入设备文件或通过蓝牙网络发送。我不想反序列化同一个类。我将收到一个再次是字节数组的响应,我最终需要将响应解包到另一个类
【问题讨论】:
-
如果你真的需要实现可移植的(通过有线(-less),针对不同的机器)序列化,那么看看像protocol-buffers或boost-serialization这样的框架。
-
上述函数只对POD类型有用。如果你想编写代码来序列化/反序列化 std::string,你必须实际去做。这并不难,但正确的做法很大程度上取决于你的外部问题——你打算用这些向量做什么?
-
更新问题与外部问题