2013-03-28 1 views
-2

Это фрагмент кода из 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, так же, как и выше в структуре массива char. Но, как вы видите, они используют функции memset и mem cpy.

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

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

+0

Какой идиот дал мне 2 ранга, что я неправильно спросил? – kamal

ответ

1

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

Если заменить 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);