10
votes

Comment puis-je convertir un int à deux octets en C #?

Comment puis-je convertir un int à deux octets en C #?


6 commentaires

Quelle partie de l'int? Deux octets ne suffisent pas pour encoder une valeur entières entièrement 32 bits.


int nécessite 4 octets pour stockage. Souhaitez-vous perdre l'information dans les MSBS?


Qui le bip a baissé cela. Ceci est une question utile et intéressante car la manière C soudainement ne fonctionne soudainement pas pour une bonne raison en C # et les API évidentes n'existent pas (le bitconverter est lent et cassé à bien des égards).


@Joshua Les voies C fonctionnent si vous passez à "dangereux" C #


@Joshua: Cela peut, ou n'est peut-être pas utile et intéressant, mais il est également mal spécifié. La question suggère un int / int32 , auquel cas l'OP souhaite-t-il la paire la plus sig? la paire la moins sig? une partie de chacun? une sorte de xor ésotérique? Je n'ai pas encore indiqué que ...


J'ai interprété cela comme nécessitant un format de fichier spécifié par 2 octets entier.


5 Réponses :


14
votes

en supposant que vous voulez juste que vous voulez juste que les bytes basses: xxx

Cependant, car "int 'est" int32 "qui laisse 2 autres octets non adaptés.


7 commentaires

C'est ma solution. Beaucoup doit plus vite que Bitconverter.


@Joshua, j'ai fait une marque de banc rapide (version de version, 50000000 itérations, chronométrage et test complet répété deux fois pour supprimer divers artefacts) et la différence entre la création d'une matrice et l'utilisation du bit-masquing par rapport au bitconverter appelle est d'environ 1NS par appel sur ma machine. Si vous supprimez la création de la matrice (obtenez simplement les deux octets), la différence est d'environ 14ns.


Je ne doute pas de vos repères. Bitconverter est lent en comparaison car il doit allouer des tableaux. Si je peux préconiser ma taille de matrice pour des milliers d'entiers, je peux sauvegarder une durée non triviale.


@Joshua, non trivial est, bien sûr, relatif. À une différence de 14ns, vous devrez exécuter 1 million d'itérations pour observer un délai de 14 ms à partir de l'allocation de matrice supplémentaire. L'allocation de mémoire pour les petits objets temporaires par le CLR est en fait assez bon marché. C'est une conséquence de la conception de collectionneur des ordures, qui compacte le tas pendant la collecte, ce qui permet une allocation sans nécessiter de manipulation de la fragmentation.


Essayez-le sur mono, faites brûler. Pas que la plupart des gens se soucient.


@Joshua - ce n'est pas mono qui est le problème - c'est une endimité différente. L'approche de décalage est-elle complète (je suppose que le commentaire mono était destiné à Bitconverter, pas de changement?)


Pouvons-nous noter que c'est assez indépendant de la langue?



4
votes

Vous pouvez utiliser bitconverter.getbytes pour obtenir les octets comprenant un Int32. Il y aura 4 octets dans le résultat, cependant, pas 2.


0 commentaires

3
votes

Une autre façon de le faire, bien que pas aussi slick que d'autres méthodes: xxx


1 commentaires

Pouvez-vous s'il vous plaît expliquer comment récupérer l'entier de 2 octets en utilisant cette solution



3
votes

Est-ce un int16?

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


0 commentaires

0
votes

option 1: xxx

option 2: xxx

i préférez l'option 1!


0 commentaires