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é

  1. packetbuffer [0] sera 0xC
  2. packetbuffer [1] sera 0x00
  3. packetbuffer [2] sera 0x50
  4. 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];
Était-ce utile?

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)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top