无法正确地将char数组memcpy到struct

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)

Rob*_*ale 5

请不要使用此方法来序列化结构.这完全不便携.

此外,编译器还可以根据目标体系结构,字节序,优化和一堆其他内容来填充,对齐或重新排序成员.

更优雅的方法是使用boost :: Serialization,它以便携方式处理低级细节.

另一方面,如果你只是想检查你的结构,那么调试器就派上用场了......