Итак, у меня есть конструкция, называемая пакетом
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
Но memcpy в deserialze не дает мне имя_файла, но дает длину пакета. Что случилось с этим? Спасибо!
РЕДАКТИРОВАТЬ: Теперь мне ясно, что 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);
}
wchar_t
в вашей целевой системе. Бьюсь об заклад, это не 1 байт, поэтому ваши ожидания по размеру неверны.wchar_t file_name[256]
должно быть не менее 512 байт, а не 256. Дайте тогда последний раздел вашего вопроса, я уверен, вы смотрите на неправильное смещение в массиве. - person Captain Obvlious   schedule 23.04.2014char
сwchar_t
. Поскольку похоже, что размерwchar_t
в вашей системе составляет два байта, а не четыре, я предполагаю, что это выполняется на компьютере с Windows. Ознакомьтесь с wmemcpy и wmemcpy_s. - person jliv902   schedule 23.04.2014