質問

すでにご存知かもしれませんが、私は C# に移行中ですが、C++ では一部のものが異なって見えます。

C++ コード

    BYTE packetBuffer[32] = {0};
    *(LPWORD)(packetBuffer + 0) = 0xC;
    *(LPWORD)(packetBuffer + 2) = 0x5000;
    *(LPDWORD)(packetBuffer + 6) = dwArgs[13];
    *(LPDWORD)(packetBuffer + 10) = *(keyArray2 + 0);
    *(LPDWORD)(packetBuffer + 14) = *(keyArray2 + 1);

dwArgs と keyArray2 は「DWORD の配列」であることに注意してください。

こんな感じで置かれています

  1. packetbuffer[0]は0xCになります
  2. パケットバッファ[1]は0x00になります
  3. packetbuffer[2]は0x50になります
  4. パケットバッファ[3]は0x00になります

等々

C# でそれを行うにはどうすればよいでしょうか?

これを試してみましたが、うまくいきません

packetBuffer[0] = 0xC;
packetBuffer[2] = (byte)0x5000; //error
packetBuffer[6] = (byte)dwArgs[13];
役に立ちましたか?

解決

使用できます BitConverter データをバイト配列との間で変換します。残念ながら、既存の配列にコピーする機能はありません。私自身の EndianBitConverter 私の中で MiscUtil ライブラリ 必要に応じてこれを許可するだけでなく、使用するエンディアンを指定することももちろん可能です。(BitConverter 通常、.NET ではリトル エンディアンです。 IsLittleEndian 分野。)

例えば:

EndianBitConverter converter = EndianBitConverter.Little;
converter.CopyBytes((short) 0xc, packetBuffer, 0);
converter.CopyBytes((int) 0x5000, packetBuffer, 2);
converter.CopyBytes(dwArgs[13], packetBuffer, 6);

等キャストは int 2回目の電話で CopyBytes は冗長ですが、わかりやすくするために含めています (前の行を念頭に置いてください)。

編集:.NET 標準ライブラリを使い続けたい場合は、別の方法として、次のような方法があります。 BinaryWriter とともに MemoryStream.

他のヒント

あなたがすることはできません。 C#が強く型付けされています。変数は1、および一種類のみを持っています。 C ++ reinterpret_castはのような策略が許可されていません。

あなたの問題のいくつかのアプローチは、しかしあります。最初に、そして明らかに、内蔵のシリアル化のフレームワークを使用することです。あなたがする必要がある場合を除き、独自のシリアル化コードを書く気にしないでください。そして.NETで、あなたが頻繁にする必要はありません。

秒(GetBytesメソッドがバイト配列に変換するためのトリックを行う必要があり)BitConverterクラスを使用することである

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top