2009-03-28 13 views
0

umwandeln Wie ich schon weiß, ich migrieren in C# und einige Dinge in C++ sehen anders aus.Wie man ein DWord in ein Byte-Array in C#

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

  1. packetbuffer [0] wird gesetzt wird 0xC
  2. packetbuffer [ 1] wird 0x00 sein
  3. packetbuffer [2] wird 0x50 sein
  4. packetbuffer [3] 0x00

und so weiter

Wie das in C# tun?

Ich versuchte dies, aber es nicht

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

Antwort

2

Sie können BitConverter funktioniert verwenden, um Daten zu und von Byte-Arrays zu konvertieren. Leider gibt es keine Möglichkeit, in ein bestehendes Array zu kopieren. Meine eigene EndianBitConverter in meinem MiscUtil library ermöglicht dies, wenn Sie es brauchen, sowie die Festlegung der Endianness zu verwenden, natürlich. (BitConverter ist in der Regel wenig Endian in .NET - Sie kann 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 zu int im zweiten Aufruf zu CopyBytes redundant ist, aber Aus Gründen der Übersichtlichkeit (unter Berücksichtigung der vorherigen Zeile!).

BEARBEITEN: Eine weitere Alternative, wenn Sie lieber bei den .NET-Standardbibliotheken bleiben möchten, können Sie BinaryWriter mit einem MemoryStream verwenden.

+0

@ Jon Skeet, Dank! Könnten Sie Ihre Bibliothek überprüfen, wenn es Ihnen erlaubt, diesen Job zu machen). Auch ein Beispiel, wie es funktioniert, wird sehr geschätzt. –

+0

@John: Ich habe bearbeitet, während Sie kommentiert wurden :) –

0

Sie können nicht. C# ist stark typisiert. Eine Variable hat einen und nur einen Typ. Tricks wie C++ reininterpret_cast sind nicht erlaubt.

Es gibt jedoch mehrere Ansätze für Ihr Problem. Die erste und offensichtlichste Methode ist die Verwendung des integrierten Serialisierungsframeworks. Schreiben Sie nicht Ihren eigenen Serialisierungscode, es sei denn, Sie müssen. Und in .NET müssen Sie nicht oft.

Die zweite ist die BitConverter Klasse zu verwenden (die GetBytes Methode sollte für die Umstellung auf Byte-Array den Trick)

+0

Stark typisiert bedeutet nicht, dass Sie nicht mit den Bits und Bytes in einem primitiven Wert-Typ wie die Integral-Typen geigen können. Die stärkste Einschränkung im CLR-Typisierungssystem besteht darin, zwischen Referenztypen zu konvertieren. –

+0

@Cecil: Nein, es gibt keine Möglichkeit, ** zwischen den Typen, nach denen das OP fragt, zu legen.Sie können eine beliebige Anzahl von Konvertierungs-/Serialisierungsklassen und -funktionen verwenden, um ein neues Objekt basierend auf dem Wert des Quellobjekts zu erstellen, aber Sie können kein Objekt eines Typs annehmen und so tun, als hätte es die ganze Zeit einen anderen Typ. Welches ist der spezifische Ansatz, nach dem das OP fragt? – jalf

Verwandte Themen