memcpy из объекта класса в структурную переменную - PullRequest
1 голос
/ 16 апреля 2019

У меня есть два разных приложения. Я должен отправить информацию из одного приложения в другое. В одном приложении есть кодировка в объекте класса, а в другом приложении она декодируется в объекте структуры с теми же типами данных.

Правильно ли реализовано копирование объекта класса в структуру с одинаковыми типами данных? или я должен изменить одну из частей кодирования / декодирования?

Я попробовал, кажется, что это правильно memcpy, но я не понимаю, правильно это или нет ..

Например ...

#include <iostream>
#include <cstring>

class capn{
    public:
    unsigned short int apn[8];
    unsigned short int a;
};

class creq{
    public:
    capn a1;
    capn a2;
    unsigned short int t;
    capn a3;
};

class cy{
    public:
    capn a1;
    capn a2;
    unsigned short int aaa[34];
    capn a3;
    unsigned short int bbb[12];
};

class cx{
    public:
    cx(){
        a=0;
        b=0;
        c=0;
        memset(d,0,8);
    }
    unsigned int a;
    unsigned int b;
    unsigned int c;
    union {
        creq requ;
        cy pasd;
    };
    unsigned short int d[8];
};



struct apn{
    unsigned short int apn[8];
    unsigned short int a;
};

struct req{
    struct apn a1;
    struct apn a2;
    unsigned short int t;
    struct apn a3;
};

struct y{
    struct apn a1;
    struct apn a2;
    unsigned short int aaa[34];
    struct apn a3;
    unsigned short int bbb[12];
};

struct x{
    unsigned int a;
    unsigned int b;
    unsigned int c;
    union {
        struct req requ;
        struct y pasd;
    };
    unsigned short int d[8];
};

int main()
{
    struct x ox;
    ox.a=1;
    ox.b=2;
    ox.c=3;
    ox.d[0]=4;
    ox.requ.a1.a=5;
    ox.requ.t=6;

    cx obj;
    std::cout<<sizeof(ox)<<std::endl;
    std::cout<<sizeof(obj)<<std::endl;

    memcpy(&obj,&ox,sizeof(ox));
    std::cout<<obj.a<<" " <<obj.b<< " " <<obj.c<< " "<<obj.d[0]<< " " <<obj.requ.a1.a<<" "<<obj.requ.t<<std::endl;
    return 0;
}

1 Ответ

5 голосов
/ 16 апреля 2019

У вас есть две проблемы здесь.

  1. Как сериализовать ваш объект,
  2. Как перенести его в другое адресное пространство.

Сериализация с помощью memcpy возможна, только если объект содержит POD члены И вы знаете детали архитектуры низкого уровня, такие как выравнивание, порядковый номер и т. Д. ( Trivially Copiable ).Для меньшего количества проблем вы можете попробовать сериализовать в XML.

Чтобы передать получателю, это зависит от того, где находится получатель.Например, если это другое адресное пространство, вы можете использовать Сокеты или (в Windows) File Mapping .Если это DLL в том же адресном пространстве, вы можете просто поделиться указателем на сериализованные данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...