Wie ein dword in einen Byte-Array in C # werfen
Frage
Wie Sie vielleicht schon wissen, ich bin die Migration in C # und einige Dinge in C ++ anders aussehen.
C ++ Code
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);
Hinweis dwArgs und keyArray2 sind "Array von DWORD"
Dies ist, wie es platziert
- packetbuffer [0] wird 0xC
- packetbuffer [1] wird 0x00
- packetbuffer [2] wird 0x50
- packetbuffer [3] wird 0x00
und so weiter
Wie das in C # tun?
Ich habe versucht, aber es funktioniert nicht
packetBuffer[0] = 0xC;
packetBuffer[2] = (byte)0x5000; //error
packetBuffer[6] = (byte)dwArgs[13];
Lösung
Sie können mit BitConverter
Daten konvertieren und von Byte-Arrays. Leider gibt es keine Möglichkeit, in eine bestehende Array zu kopieren. Meine eigene EndianBitConverter
in meinem MiscUtil Bibliothek dies ermöglicht es, wenn Sie es brauchen, so gut wie Sie erlaubt zur Angabe der endianness natürlich zu verwenden. (BitConverter
ist in der Regel wenig Endian in .NET -. Sie es mit dem IsLittleEndian
Feld überprüfen)
Zum Beispiel:
EndianBitConverter converter = EndianBitConverter.Little;
converter.CopyBytes((short) 0xc, packetBuffer, 0);
converter.CopyBytes((int) 0x5000, packetBuffer, 2);
converter.CopyBytes(dwArgs[13], packetBuffer, 6);
usw. Die Besetzung im zweiten Aufruf int
ist überflüssig CopyBytes
, aber aus Gründen der Übersichtlichkeit enthalten (unter Berücksichtigung der vorherigen Zeile!).
EDIT: Eine andere Alternative, wenn Sie nicht mit den .NET-Standardbibliotheken bleiben würde, möchten Sie vielleicht BinaryWriter
mit MemoryStream
.
Andere Tipps
Sie können nicht. C # ist stark typisiert. Eine Variable hat eine, und nur eine Art. Tricksen wie die reinterpret_cast C ++ ist nicht erlaubt.
Es gibt mehrere Ansätze, um Ihr Problem though. Die erste, und offensichtlich ist, ist die Einbau-Serialisierung Rahmen zu verwenden. Kümmern Sie sich nicht Ihre eigene Serialisierung Code zu schreiben, wenn Sie zu haben. Und in .NET, nicht wahr oft müssen.
Die zweite ist die BitConverter Klasse zu verwenden (die GetBytes Verfahren zur Umwandlung von zu Bytedatenfeld den Trick sollte)