Пользовательские Скалярные Типы Значений - PullRequest
1 голос
/ 07 марта 2020

В настоящее время я пытаюсь переписать сетевой код приложения MF C, чтобы он соответствовал новому серверу (записан в c#) позже. Я экспериментирую с protobuf, чтобы убедиться, что все модели данных одинаковы.

Моя проблема в том, что Scalar Value Types, с которыми работает protobuf, не понимается системой типов MF C. Он использует DWORD вместо uint32, BYTE вместо байта или bool и так далее. Для этого требуется настраиваемое отображение / приведение типов, и это не обязательно требует работы с моих плеч. Есть ли способ изменить эти типы данных, используемые в protobuf?

Пример модели protobuf будет:

syntax = "proto3";
package CInterop;

option csharp_namespace = "CCX.Protobuf.Login";

message LoginAck {
    LoginResultStatus Status = 1;
    uint32 dwUserID = 2;
    uint32 dwCharID = 3;
    uint32 dwKEY = 4;
    uint32 dwMapIP = 5;
    uint32 wPort = 6;
    uint32 bCharCreateCount = 7; 
    bool IsInPcRoom = 8;
    uint32 PremiumPcRoomValue = 9; 
    uint64 dCurrentTime = 10;

    uint64 dKey = 11;
    string Reason = 12;
    uint64 iDuration = 13;
    bool bEternal = 14;
  }

Текущее использование будет

CInterop::LoginAck loginAck;

(*pPacket) >> loginAck; // Reads the packet from the buffer

m_dwUserID = (DWORD)loginAck.dwuserid();
m_dwKickID = (DWORD)loginAck.dwcharid();
m_dwKEY = (DWORD)loginAck.dwkey();
vADDR.sin_addr.S_un.S_addr = (ULONG)loginAck.dwmapip();
vADDR.sin_port = (USHORT)loginAck.wport();
m_bCreateCardCnt = (byte)loginAck.bcharcreatecount();
m_bInPCROOM = (BYTE)loginAck.isinpcroom();
m_dwPrmPCROOM = (DWORD)loginAck.premiumpcroomvalue();

Но здесь Я не хочу приводить типы, это должно как-то происходить автоматически.

...