質問
すでにご存知かもしれませんが、私は 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 の配列」であることに注意してください。
こんな感じで置かれています
- packetbuffer[0]は0xCになります
- パケットバッファ[1]は0x00になります
- packetbuffer[2]は0x50になります
- パケットバッファ[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クラスを使用することである