0

すでにご存知かもしれませんが、私は 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. packetbuffer[1] は 0x00 になります
  3. packetbuffer[2] は 0x50 になります
  4. パケットバッファ[3] は 0x00 になります

等々

C#でそれを行う方法は?

私はこれを試しましたが、うまくいきません

packetBuffer[0] = 0xC;
packetBuffer[2] = (byte)0x5000; //error
packetBuffer[6] = (byte)dwArgs[13];
4

2 に答える 2

2

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

例えば:

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

int2 番目の呼び出しでのへのキャストCopyBytesは冗長ですが、わかりやすくするために含めています (前の行を念頭に置いてください!)。

編集: .NET 標準ライブラリに固執する場合の別の代替手段としてBinaryWriterMemoryStream.

于 2009-03-28T18:20:29.067 に答える
0

できません。C# は厳密に型指定されています。変数の型は 1 つだけです。C++ の reinterpret_cast のようなトリックは許可されていません。

ただし、問題にはいくつかのアプローチがあります。最初の明らかな方法は、組み込みのシリアライゼーション フレームワークを使用することです。必要がない限り、独自のシリアル化コードを書く必要はありません。.NET では、多くの場合、その必要はありません。

2 つ目は、BitConverter クラスを使用することです (GetBytes メソッドは、バイト配列に変換するためのトリックを実行する必要があります)。

于 2009-03-28T18:22:50.057 に答える