Comment jeter un dword dans un tableau d'octets en C #
Question
Comme vous le savez peut-être, je migration en C # et certaines choses en C ++ un aspect différent.
code 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);
Note dwArgs et keyArray2 sont "tableau de DWORD"
Voici comment il est placé
- packetbuffer [0] sera 0xC
- packetbuffer [1] sera 0x00
- packetbuffer [2] sera 0x50
- packetbuffer [3] sera 0x00
et ainsi de suite
Comment faire en C #?
J'ai essayé, mais ça ne fonctionne pas
packetBuffer[0] = 0xC;
packetBuffer[2] = (byte)0x5000; //error
packetBuffer[6] = (byte)dwArgs[13];
La solution
Vous pouvez utiliser BitConverter
pour convertir des données vers et de tableaux d'octets. Malheureusement, il n'y a pas de possibilité de copier dans un tableau existant. Mon propre EndianBitConverter
dans mon bibliothèque MiscUtil permet cela si vous en avez besoin, ainsi que vous permettant de préciser le boutisme à utiliser bien sûr. (BitConverter
est généralement peu endian dans .NET -., Vous pouvez le vérifier avec le champ IsLittleEndian
)
Par exemple:
EndianBitConverter converter = EndianBitConverter.Little;
converter.CopyBytes((short) 0xc, packetBuffer, 0);
converter.CopyBytes((int) 0x5000, packetBuffer, 2);
converter.CopyBytes(dwArgs[13], packetBuffer, 6);
etc. Le casting à int
dans le second appel à CopyBytes
est redondant, mais inclus pour plus de clarté (en gardant à l'esprit la ligne précédente!).
EDIT: Une autre alternative si vous préférez coller avec les bibliothèques standards .NET, vous voudrez peut-être utiliser BinaryWriter
avec MemoryStream
.
Autres conseils
Vous ne pouvez pas. C # est fortement typée. Une variable a un, et un seul type. Supercherie comme le reinterpret_cast du C est pas autorisée.
Il existe plusieurs approches à votre problème cependant. La première et évidente, est d'utiliser le cadre de sérialisation intégré. Ne vous inquiétez pas écrire votre propre code de sérialisation à moins que vous devez. Et dans .NET, vous ne devez pas souvent.
La seconde consiste à utiliser la classe BitConverter (la méthode GetBytes devrait faire l'affaire pour convertir en tableau d'octets)