C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 无法正确地将char数组memcpy到struct大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
所以我有一个名为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));
    }
};

我正试图从这些数据中剔除

{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

但deserialze中的memcpy并没有给我file_name,但它确实给了我packet_length.怎么了?谢谢!

编辑:
所以我现在很清楚,wchar_t占据的空间比我想象的要多;但是,我被告知不要使用memcpy

我已经编写了这个反序列化方法,它正确地抓取了数据.这会导致安全漏洞吗?

void deserialize(const char * dat) {
        memcpy(&(packet_typE),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);
    }

解决方法

char数组的布局假定wchar_t的大小是两个字节;它不是 – 这里是wchar_t的大小为4的系统的示例,因此Packet的大小是10756,而不是2692字节:( link to a demo).

这就是为什么编辑中的memcpy技巧会出现问题:它假设char []数组中的数据布局与wchar_t []数组的布局相匹配,它可能匹配也可能不匹配.如果您知道数据数组具有以小端格式存储的双字符元素(LSB优先),您可以编写自己的函数将数据从源转换为目标,并调用它以获取部分序列化数据,如这个:

void bytes_to_wchar(wchar_t *dest,const unsigned char* src,size_t length) {
    for (size_t i = 0 ; i != lengt ; i++) {
        dest[i] = src[2*i] | (src[2*i+1] << 8);
    }
}

现在,您可以使用此函数将数据复制到wchar_t数组中,而与目标系统上的wchar_t大小或目标系统的字节顺序无关:

void deserialize(const char * dat) {
    bytes_to_wchar(packet_type,dat + 0,4);
    bytes_to_wchar(packet_length[0],128);
    bytes_to_wchar(file_name[0],256);
    bytes_to_wchar(template_name[0],256);
    bytes_to_wchar(file_name_list[0],1024);
    bytes_to_wchar(file_data[0],1024);
}

您使用相同的编译器在同一硬件上执行此操作时,从内存中保存数据并将其写回的快捷方式可能会起作用.即使这样,它仍然对您使用的标头和编译器设置中的小调整很敏感.

如果需要复制到结构中的字符数组具有固定布局,则需要编写一个函数来处理该布局,将两字节组转换为wchar_ts,将四字节组转换为无符号整数,依此类推.

大佬总结

以上是大佬教程为你收集整理的c – 无法正确地将char数组memcpy到struct全部内容,希望文章能够帮你解决c – 无法正确地将char数组memcpy到struct所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。