Convertir 2 octets en nombre
J'ai un contrôle qui a un tableau d'octets.
Chaque maintenant et puis il y a deux octets dites-moi un peu d'info sur le nombre de futurs éléments dans le tableau.
Ainsi, à titre d'exemple, je pourrais avoir:
... ... Élément [4] = 7 L'article [5] = 0 ... ...
La valeur de ce qui est clairement 7.
Mais que penser de cela?
... ... Élément [4] = 0 L'article [5] = 7 ... ...
Aucune idée sur ce qui équivaut à (normal int)?
Je suis allé à l'binaire et de la pensée, il peut être 11100000000 ce qui équivaut à 1792. Mais je ne sais pas si c'est la façon dont il fonctionne vraiment (c'est à dire qu'il n'utilise l'ensemble de 8 éléments pour l'octet).
Est-il un moyen de savoir ce avec des tests?
Note: je suis à l'aide de C# 3.0 et visual studio 2008
source d'informationauteur Vaccano
Vous devez vous connecter pour publier un commentaire.
BitConverter
pouvez facilement convertir les deux octets dans un de deux octets valeur entière:Un deux-nombre d'octet a une basse et une haute octet. L'octet de poids fort vaut 256 fois plus que l'octet de poids faible:
Donc, pour la haute=0 et faible=7, la valeur est de 7. Mais pour le haut=7 et faible=0, la valeur devient 1792.
Bien sûr, cela suppose que le nombre est un simple entier 16 bits. Si c'est quelque chose de plus sophistiqué, le ci-dessus ne sera pas assez. Ensuite, vous avez besoin de plus de connaissances sur la façon dont le nombre est codé, afin de le décoder.
L'ordre dans lequel les hautes et les basses octets apparaissent est déterminé par le endianness du flux d'octets. En big-endian, vous verrez élevée faible (moins d'adresse), en little-endian, c'est l'inverse.
Vous dites "cette valeur est clairement 7", mais il dépend entièrement de l'encodage. Si nous assumons la pleine-largeur octets, puis en little-endian, oui; 7, 0 est 7. Mais en big endian, il ne l'est pas.
Pour little-endian, ce que vous voulez est
et pour big-endian:
Mais d'autres systèmes de codage sont disponibles; par exemple, certains régimes, les 7 bits de l'arithmétique, avec la 8ème peu comme une suite de bits. Certains régimes (UTF-8) mettre tous la poursuite des bits du premier octet (donc la première a peu de marge de manoeuvre pour les bits de données), et 8 bits pour le reste de la séquence.
Si vous voulez simplement mettre les deux octets uns à côté des autres dans un format binaire, et voir ce que le grand nombre est décimal, alors vous devez utiliser ce code:
Si vous utilisez
short num = BitConverter.ToInt16(Item, 4);
comme on le voit dans la accepté de répondre, vous êtes en supposant que le premier bit de ces deux octets, le bit de signe (1 = négatif et 0 = positif). Cette réponse est-elle suppose l'utilisation d'un big endian système. Voir cette pour plus d'informations sur le bit de signe.Utilisation BitConveter.ToInt32 je ne suis pas sûr à 100% que vous donnerait le bon résultat mais vous pouvez essayer de
Si ces octets sont les "parties" d'un entier, il fonctionne comme ça. Mais attention, que l'ordre des octets de la plate-forme et qu'il dépend également de la durée de l'entier (16 bits=2 octets, 32 bits=4 octets, ...)
Dans le cas où l'article[5] est le MSB
ushort résultat = BitConverter.ToUInt16(new byte[2] { Article[5], le Point[4] }, 0);
int result = 256 * Point[5] + [4];