-2

これは 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#で上記の構造を作成し、初期化もしましたが、構造の上と同じ方法でchar配列に入れ、stringbuilder変数に入れたいと思います。しかし、ご覧のとおり、memset および mem cpy 関数を使用しています。

c# で同じことを達成するにはどうすればよいですか?

上記の構造を stringbuilder 変数 c# に配置するにはどうすればよいですか?構造からバイトを抽出して文字列ビルダー変数に配置するにはどうすればよいですか?

4

1 に答える 1

1

charC# でバイトを格納するために s を使用することはお勧めしません( charC# では Unicode であるため、実際には 2 バイトです)。
.NET にはこの種のデータのデータ型があり、1 バイトも含まれているため、 byteC++ の に似ています。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);
于 2013-03-28T07:48:33.317 に答える