Гость
Неправильные данные при выполнении memcpy и печати
Сообщение
Гость » 11 мар 2024, 22:40
Я пишу код, который получает некоторые данные из другого приложения через сокет UDP, преобразует их в структуру, а затем создаю pduMessage и считываю их в том же коде, чтобы протестировать.
Структура, в которую я конвертирую полученные данные:
Код: Выделить всё
struct Instruction
{
int type;
std::array instruction;
std::array verbal_transition_alert_instruction;
std::array verbal_succinct_transition_instruction;
std::array verbal_pre_transition_instruction;
std::array verbal_post_transition_instruction;
// std::vector street_names;
// std::vector begin_street_names;
double time;
double length;
double cost;
int begin_shape_index;
int end_shape_index;
std::array travel_mode;
std::array travel_type;
};
struct ReceivedData
{
int path_size;
int instruction_size;
std::vector path;
double distance;
std::vector instructions;
double time;
};
PDU_Message structure:
Код: Выделить всё
struct BasePacket
{
uint32_t crc32;
uint16_t count;
uint16_t version;
uint64_t timestamp;
char payload[56000];
};
struct PDUMessage
{
unsigned int messageID;
unsigned int messageLength;
BasePacket basePacket;
};
Now I am creating the
in the below code:
Код: Выделить всё
PDUMessage create_PDUMessage(unsigned int messageID, unsigned int messageLength, ReceivedData parsedData)
{
PDUMessage pduMessage;
pduMessage.messageID = messageID;
pduMessage.messageLength = messageLength;
// Copy path size and instruction size into payload
memcpy(pduMessage.basePacket.payload, &parsedData.path_size, sizeof(int));
memcpy(pduMessage.basePacket.payload + sizeof(int), &parsedData.instruction_size, sizeof(int));
// Copy path coordinates into payload
size_t offset = 2 * sizeof(int);
for (const auto &coord : parsedData.path)
{
memcpy(pduMessage.basePacket.payload + offset, &coord.first, sizeof(double));
memcpy(pduMessage.basePacket.payload + offset + sizeof(double), &coord.second, sizeof(double));
offset += 2 * sizeof(double);
}
// Copy distance into payload
memcpy(pduMessage.basePacket.payload + offset, &parsedData.distance, sizeof(double));
offset += sizeof(double);
// Copy instructions into payload
for (const auto &instr : parsedData.instructions)
{
memcpy(pduMessage.basePacket.payload + offset, instr.instruction.data(), instr.instruction.size());
offset += instr.instruction.size();
memcpy(pduMessage.basePacket.payload + offset, instr.verbal_transition_alert_instruction.data(), instr.verbal_transition_alert_instruction.size());
offset += instr.verbal_transition_alert_instruction.size();
memcpy(pduMessage.basePacket.payload + offset, instr.verbal_succinct_transition_instruction.data(), instr.verbal_succinct_transition_instruction.size());
offset += instr.verbal_succinct_transition_instruction.size();
memcpy(pduMessage.basePacket.payload + offset, instr.verbal_pre_transition_instruction.data(), instr.verbal_pre_transition_instruction.size());
offset += instr.verbal_pre_transition_instruction.size();
memcpy(pduMessage.basePacket.payload + offset, instr.verbal_post_transition_instruction.data(), instr.verbal_post_transition_instruction.size());
offset += instr.verbal_post_transition_instruction.size();
}
// Set other fields of base packet
for (const auto &path : parsedData.path){
// std::cout
Источник: [url]https://stackoverflow.com/questions/78128014/incorrect-data-while-doing-memcpy-and-printing[/url]
1710186006
Гость
Я пишу код, который получает некоторые данные из другого приложения через сокет UDP, преобразует их в структуру, а затем создаю pduMessage и считываю их в том же коде, чтобы протестировать. Структура, в которую я конвертирую полученные данные: [code]struct Instruction { int type; std::array instruction; std::array verbal_transition_alert_instruction; std::array verbal_succinct_transition_instruction; std::array verbal_pre_transition_instruction; std::array verbal_post_transition_instruction; // std::vector street_names; // std::vector begin_street_names; double time; double length; double cost; int begin_shape_index; int end_shape_index; std::array travel_mode; std::array travel_type; }; struct ReceivedData { int path_size; int instruction_size; std::vector path; double distance; std::vector instructions; double time; }; [/code] PDU_Message structure: [code]struct BasePacket { uint32_t crc32; uint16_t count; uint16_t version; uint64_t timestamp; char payload[56000]; }; struct PDUMessage { unsigned int messageID; unsigned int messageLength; BasePacket basePacket; }; [/code] Now I am creating the [code]PDU_Messages[/code] in the below code: [code]PDUMessage create_PDUMessage(unsigned int messageID, unsigned int messageLength, ReceivedData parsedData) { PDUMessage pduMessage; pduMessage.messageID = messageID; pduMessage.messageLength = messageLength; // Copy path size and instruction size into payload memcpy(pduMessage.basePacket.payload, &parsedData.path_size, sizeof(int)); memcpy(pduMessage.basePacket.payload + sizeof(int), &parsedData.instruction_size, sizeof(int)); // Copy path coordinates into payload size_t offset = 2 * sizeof(int); for (const auto &coord : parsedData.path) { memcpy(pduMessage.basePacket.payload + offset, &coord.first, sizeof(double)); memcpy(pduMessage.basePacket.payload + offset + sizeof(double), &coord.second, sizeof(double)); offset += 2 * sizeof(double); } // Copy distance into payload memcpy(pduMessage.basePacket.payload + offset, &parsedData.distance, sizeof(double)); offset += sizeof(double); // Copy instructions into payload for (const auto &instr : parsedData.instructions) { memcpy(pduMessage.basePacket.payload + offset, instr.instruction.data(), instr.instruction.size()); offset += instr.instruction.size(); memcpy(pduMessage.basePacket.payload + offset, instr.verbal_transition_alert_instruction.data(), instr.verbal_transition_alert_instruction.size()); offset += instr.verbal_transition_alert_instruction.size(); memcpy(pduMessage.basePacket.payload + offset, instr.verbal_succinct_transition_instruction.data(), instr.verbal_succinct_transition_instruction.size()); offset += instr.verbal_succinct_transition_instruction.size(); memcpy(pduMessage.basePacket.payload + offset, instr.verbal_pre_transition_instruction.data(), instr.verbal_pre_transition_instruction.size()); offset += instr.verbal_pre_transition_instruction.size(); memcpy(pduMessage.basePacket.payload + offset, instr.verbal_post_transition_instruction.data(), instr.verbal_post_transition_instruction.size()); offset += instr.verbal_post_transition_instruction.size(); } // Set other fields of base packet for (const auto &path : parsedData.path){ // std::cout Источник: [url]https://stackoverflow.com/questions/78128014/incorrect-data-while-doing-memcpy-and-printing[/url]