jac*_*ith 3 c++ bytearray char memcpy deserialization
所以我有一个名为packet的结构
struct Packet {
unsigned int packet_type;
wchar_t packet_length[128];
wchar_t file_name[256];
wchar_t template_name[256];
wchar_t file_name_list[1024];
wchar_t file_data[1024];
void serialize(char * dat) {
memcpy(dat, this, sizeof(Packet));
}
void deserialize(const char * dat) {
memcpy(this, dat, sizeof(Packet));
}
};
Run Code Online (Sandbox Code Playgroud)
我正试图从这些数据中剔除
{byte[2692]}
[0] 0 unsigned int packet_type; (4 bytes)
[1] 0
[2] 0
[3] 0
[4] 50 '2' wchar_t packet_length[128]; (128 bytes)
[3] 0
[5] 54 '6'
[3] 0
[6] 57 '9'
[3] 0
[7] 50 '2'
[8] 0
[...] 0
[132] 112 'p' wchar_t file_name[256]; (256 bytes)
[133] 0
[134] 104 'h'
[...] 0
Run Code Online (Sandbox Code Playgroud)
但deserialze中的memcpy并没有给我file_name,但它确实给了我packet_length.怎么了?谢谢!
编辑:所以我现在很清楚wchar_t占用的空间比我想象的要多; 但是,我被告知不要使用memcpy?
我已经编写了这个反序列化方法,它正确地抓取了数据.这会导致安全漏洞吗?
void deserialize(const char * dat) {
memcpy(&(packet_type), dat, 4);
memcpy(&(packet_length[0]), dat + 4, 128);
memcpy(&(file_name[0]), dat + 132, 256);
memcpy(&(template_name[0]), dat + 388, 256);
memcpy(&(file_name_list[0]), dat + 644, 1024);
memcpy(&(file_data[0]), dat + 1668, 1024);
}
Run Code Online (Sandbox Code Playgroud)
请不要使用此方法来序列化结构.这完全不便携.
此外,编译器还可以根据目标体系结构,字节序,优化和一堆其他内容来填充,对齐或重新排序成员.
更优雅的方法是使用boost :: Serialization,它以便携方式处理低级细节.
另一方面,如果你只是想检查你的结构,那么调试器就派上用场了......
| 归档时间: |
|
| 查看次数: |
1552 次 |
| 最近记录: |