2010-07-27 4 views
0

J'ai récupéré la taille de mon struct en utilisant la taille de comme ci-dessous:Comment puis-je affecter un entier à 3Bytes de champ?

int len = Marshal.SizeOf(packet); 

Maintenant, le len a une valeur de 40. Je dois céder ce 40 à 3 octets Champ de mon Structure.My strucure ressemble ci-dessous:

public struct TCP_CIFS_Packet 
     { 
      public byte zerobyte; 
      public byte[] lengthCIFSPacket; 
      public CIFSPacket cifsPacket; 
     } 

J'ai essayé attribuer les valeurs comme suit:

tcpCIFSPacket.lengthCIFSPacket = new byte[3]; 
tcpCIFSPacket.lengthCIFSPacket[0] = Convert.ToByte(0); 
tcpCIFSPacket.lengthCIFSPacket[1] = Convert.ToByte(0); 
tcpCIFSPacket.lengthCIFSPacket[2] = Convert.ToByte(40); 

Mais cela ne semble pas être la bonne façon. Y a-t-il un autre moyen de le faire?

Modifier @ HO1 et @Rune Grimstad: Après avoir utilisé BitConverter.GetBytes comme follwoing:

tcpCIFSPacket.lengthCIFSPacket = BitConverter.GetBytes(lengthofPacket); 

La taille des lengthCIFSPacket changements à 4 octets mais j'ai seulement 3 octets d'espace pour tcpCIFSPacket.lengthCIFSPacket comme structure de paquet.

Répondre

2
 int number = 500000; 
     byte[] bytes = new byte[3]; 
     bytes[0] = (byte)((number & 0xFF) >> 0); 
     bytes[1] = (byte)((number & 0xFF00) >> 8); 
     bytes[2] = (byte)((number & 0xFF0000) >> 16); 

ou

 byte[] bytes = BitConverter.GetBytes(number); // this will return 4 bytes of course 

edit: vous pouvez aussi le faire

 byte[] bytes = BitConverter.GetBytes(number); 
     tcpCIFSPacket.lengthCIFSPacket = new byte[3]; 
     tcpCIFSPacket.lengthCIFSPacket[0] = bytes[0]; 
     tcpCIFSPacket.lengthCIFSPacket[1] = bytes[1]; 
     tcpCIFSPacket.lengthCIFSPacket[2] = bytes[2]; 
0

Vous pouvez utiliser la classe BitConverter pour convertir un Int32 en tableau d'octets à l'aide de la méthode GetBytes.

1

Regardez BitConverter.GetBytes. Il va convertir le int en un tableau d'octets. Voir here pour plus d'informations.

+0

J'ai maintenant essayé avec tcpCIFSPacket.lengthCIFSPacket = BitConverter.GetBytes (40) qui convertit lengthCIFSPacket à 4- octets mais je n'ai que 3 octets pour lengthCIFSPacket. – Simsons

+1

@Subhen: Ignorez simplement le 4ème octet et n'utilisez que les 3 premiers. Si vous lancez 'GetBytes' sur' 40', les octets contiennent '40.0.0.0', ignorez simplement le 4ème. Évidemment, cela ne fonctionnera pas pour des nombres trop grands ou pour des nombres négatifs, mais puisque vous avez seulement 3 octets pour le stocker, vous devrez faire des compromis d'une certaine manière. –

+0

@Subhen: Et si vous avez besoin de le convertir, il suffit de créer un tableau d'octets avec 4 octets, peupler les 3 premiers octets avec vos 3 octets et mettre le 4e à 0 et ensuite utiliser BitConverter.ToInt32. –

Questions connexes