конвертировать код C ++ в C #

Это фрагмент кода из C ++

struct
{
short       m_nVersion;
short       m_nMOT_Addr;
q_address   m_oDistribution_Q;
short       m_nOffset;
char        m_cOperator;
short       m_cLength;
long        m_lOperand;
char        m_cReq_Ack;
char        m_cReq_SeqGap;
char        m_cReq_AutoDereg;
} oSbsReg;

const short nMsgSize = 20;  //20 byte long structure when packed

char sMessageBuffer[nMsgSize]; // I created stringbuilder in c#

memset(&oSbsReg,0,sizeof(oSbsReg));
memset(sMessageBuffer,0,sizeof(sMessageBuffer));

oSbsReg.m_nVersion = 20;                        //Version
oSbsReg.m_nMOT_Addr = (short) lMot;             //MOT in which to register with
oSbsReg.m_oDistribution_Q.au.queue = m_oQueue.au.queue; //Current queue number
oSbsReg.m_oDistribution_Q.au.group = m_oQueue.au.group; //Current group
//changed to 0 to resolve Oswego issue when moved to DMQ 5.0
oSbsReg.m_nOffset = 0;                          //Start byte for telegram match
oSbsReg.m_cOperator = PSEL_OPER_EQ;             //Exact match
oSbsReg.m_cLength = 4;                          //Number of bytes in match
oSbsReg.m_lOperand = lTelegramId;               //Telegram Id to match against
oSbsReg.m_cReq_Ack = 1;                         //TRUE: Request an acknowledge of registration
oSbsReg.m_cReq_SeqGap = 1;                      //TRUE: Request an acknowledge of a sequence gap
oSbsReg.m_cReq_AutoDereg = 1;                   //TRUE: Request an auto deregistration on a connection loss

//default compile option is 8 byte packing, didn't want to change it
//manually pack bytes in structure to satisfy the SBS server's expectations
memcpy(sMessageBuffer, &oSbsReg, 11);
memcpy(sMessageBuffer+11, &(oSbsReg.m_cLength), 2);
memcpy(sMessageBuffer+13, &(oSbsReg.m_lOperand), 7); //twenty bytes max!

Мне нужно конвертировать вышеуказанный код в C #,

я создал вышеупомянутую структуру в c # и инициализировал тоже, но теперь я хочу поместить ее в переменную stringbuilder, так же, как выше структура в put в массиве char. Но, как вы можете видеть, они используют функции memset и mem cpy.

Как я могу добиться того же в C #?

Как я могу поместить вышеупомянутую структуру в строковую переменную C #, как я извлекаю байты из структуры и помещаю ее в строковую переменную?

-2

Решение

Я бы не рекомендовал использовать chars для хранения байтов в C # (char в C # на самом деле два байта, потому что это Unicode).
В .NET есть тип данных для такого рода данных, он называется byte, который больше похож на C ++ charпотому что он также содержит один байт.

Если вы замените T используя имя вашего типа структуры, вы можете преобразовать объект в байтовый массив, например так (кстати, вы можете сделать из этого довольно полезный универсальный метод):

int size = Marshal.SizeOf(typeof(T));
byte[] rawData = new byte[size];

IntPtr ptr = Marshal.AllocHGlobal(size);
Marshal.StructureToPtr(obj, ptr, true);
Marshal.Copy(ptr, rawData, 0, size);
Marshal.FreeHGlobal(ptr);
1

Другие решения

Других решений пока нет …