2013-09-03 2 views
-1

Comment diviser un ushort en deux variables d'octets en C#?Convertir une valeur d'ushort en deux valeurs d'octet en C#

J'ai essayé les éléments suivants (package.FrameID est ushort):

Lorsque je tente de calculer avec du papier crayon & je reçois le bon résultat. De plus, si FrameID est plus grand qu'un octet (donc le second octet n'est pas nul), cela fonctionne.

array[0] = (byte)(0x0000000011111111 & package.FrameID); 
array[1] = (byte)(package.FrameID >> 8); 

Dans mon cas package.FrameID est 56 et le résultat dans le tableau [0] est 16 au lieu de 56.

Comment puis-je résoudre ce problème?

Répondre

4

0x0000000011111111 est pas un nombre binaire, il est un nombre hexadécimal. Vous devez utiliser 0x0ff à la place.

Cependant, étant donné que le résultat est un octet et que la conversion en octet rejette les bits supérieurs de toute façon, vous n'avez pas réellement besoin de and le résultat. Vous pouvez simplement faire ceci:

array[0] = (byte)package.FrameID; 
array[1] = (byte)(package.FrameID >> 8); 

(Cela suppose que vous n'utilisez pas checked le code Si vous, puis jette une valeur supérieure à 255 à un byte provoquera une exception, vous saurez si vous utilisez.. checked code.)

+0

'0x0f' est 1 octet, si nous effectuons une opération' bit and' dessus et 'ushort', la valeur de retour est seulement le quartet inférieur de l'octet inférieur, je pense qu'il est' 0x00ff'. –

+0

@KingKing Merci, corrigé la faute de frappe –

8

Utilisez BitConverter

var bytes = BitConverter.GetBytes(package.FrameID); 
+0

Merci beaucoup! Mais toute idée quel est le problème avec ma solution? – user2071938

+0

@ user2071938 '0x0000000011111111' est un nombre ** hex ** à 8 octets. Ce ne sont pas des bits comme vous le pensez. il devrait être '0x00ff' – EZI

+0

@ user2071938 1 chiffre hex signifie 4 bits, donc 1 octet correspondra à 2 chiffres hexadécimaux. –

Questions connexes