2009-03-28 10 views
0

Comme vous le savez peut-être, je migre en C# et certaines choses en C++ sont différentes.Comment transformer un dword en un tableau d'octets en 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); 

Remarque 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 marche pas

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

Répondre

2

Vous pouvez utiliser BitConverter pour convertir des données vers et à partir des tableaux d'octets. Malheureusement, il n'y a aucune possibilité de copier dans un tableau existant. Mon propre EndianBitConverter dans mon MiscUtil library permet cela si vous en avez besoin, ainsi que vous permettant de spécifier l'endianness à 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 rester avec les bibliothèques standard .NET, vous pouvez utiliser BinaryWriter avec un MemoryStream.

+0

Skeet @ Jon, Merci! Pourriez-vous vérifier votre bibliothèque si elle vous permet de faire ce travail). Aussi, un exemple de la façon dont cela fonctionne sera très apprécié. –

+0

@John: J'étais en train d'éditer pendant que vous commentiez :) –

0

Vous ne pouvez pas. C# est fortement typé. Une variable a un et un seul type. Trickery comme le C++ reinterpret_cast n'est pas autorisé.

Cependant, il existe plusieurs approches à votre problème. Le premier, et évident, est d'utiliser le cadre de sérialisation intégré. Ne vous embêtez pas à écrire votre propre code de sérialisation, sauf si vous devez le faire. Et dans .NET, vous n'avez pas souvent à le faire.

La seconde est d'utiliser la classe BitConverter (la méthode GetBytes devrait faire l'affaire pour convertir au tableau d'octets)

+0

Fortement typé ne signifie pas que vous ne pouvez pas jouer avec les bits et les octets dans un type de valeur primitif comme les intégrales. La restriction la plus forte dans le système de typage CLR est la fusion entre les types de référence. –

+0

@Cecil: non, il n'y a aucun moyen de ** lancer ** entre les types demandés par l'OP.Vous pouvez utiliser n'importe quel nombre de classes et fonctions de conversion/sérialisation pour créer un nouvel objet basé sur la valeur de l'objet source, bien sûr, mais vous ne pouvez pas prendre un objet d'un type et prétendre avoir un autre type tout le long, quelle est l'approche spécifique que le PO demande à propos. – jalf

Questions connexes