2010-10-12 6 views
7

Comment convertir un int en deux octets en C#?Comment convertir un int en deux octets en C#?

+0

Quelle partie de l'int? Deux octets ne suffisent pas à encoder une valeur entière de 32 bits. – dtb

+1

'int' nécessite 4 octets pour le stockage. Voulez-vous perdre l'information dans les MSB? –

+0

Qui le * bip * downvoted ceci. Ceci est une question utile et intéressante car le chemin C ne fonctionne soudainement pas pour de bonnes raisons en C# et les API évidentes n'existent pas (BitConverter est lent et * cassé * à bien des égards). – Joshua

Répondre

11

en admettant que vous voulez juste les octets bas:

byte b0 = (byte)i, 
    b1 = (byte)(i>>8); 

Cependant, étant donné que 'int' est 'Int32' qui laisse 2 octets plus uncaptured.

+0

Ceci est ma solution. Beaucoup doit plus vite que BitConverter. – Joshua

+5

@Joshua, j'ai fait un benchmark rapide (Release version, 50000000 itérations, chronomètre et test complet répété deux fois pour supprimer divers artefacts) et la différence entre la création d'un tableau et l'utilisation du bit-masking vs appel BitConverter est d'environ 1ns par appeler sur ma machine. Si vous supprimez la création de tableau (il suffit d'obtenir les deux octets), la différence est d'environ 14ns. –

+0

Je ne doute pas de vos repères. BitConverter est lent en comparaison car il doit allouer des tableaux. Si je peux pré-détecter ma taille de tableau pour des milliers d'entiers, je peux économiser une quantité de temps non triviale. – Joshua

4

Vous pouvez utiliser BitConverter.GetBytes pour obtenir les octets comportant un Int32. Il y aura 4 octets dans le résultat, cependant pas 2.

2

Une autre façon de le faire, mais pas aussi lisse que d'autres méthodes:

Int32 i = 38633; 
byte b0 = (byte)(i % 256); 
byte b1 = (byte)(i/256); 
2

Est-ce un int16?

Int16 i = 7; 
byte[] ba = BitConverter.GetBytes(i); 

Il ne comportera que deux octets.