12
votes

Convertir 2 octets en un nombre

J'ai un contrôle qui a un tableau d'octets dedans.

There de temps en temps, il y a deux octets qui me disent des informations sur le nombre d'articles futurs de la matrice. P>

Ainsi Exemple que je pourrais avoir: p> xxx pré>

la valeur de ceci est clairement 7. p>

mais qu'en est-il de cela? P>

...
...
Item [4] = 0
Item [5] = 7
...
...


2 commentaires

On dirait que vous nous demandez de renverser des données sérialisées. Ça va être délicat. Vous pouvez au moins afficher quelques exemples de la matrice d'octets complets et de ce qu'il correspond à trois ou quatre exemples simples. Mais pourquoi voulez-vous le savoir quand même? Quel problème essayez-vous de résoudre?


J'essaie de déchiffrer le réseau d'octets renvoyé par le contrôle de la signature dans le contrôle OpenNetCF afin que je puisse le faire pivoter à 180 degrés. Voir cette question Stackoverflow.com/Questtions/2657388/... pour plus de détails.


6 Réponses :


16
votes

Un numéro de deux octets a un octet faible et élevé. L'octet élevé vaut 256 fois plus que l'octet faible: xxx

donc, pour hauteur = 0 et faible = 7, la valeur est 7. mais pour hauteur = 7 et low = 0 , la valeur devient 1792.

Ceci suppose bien sûr que le nombre est un simple entier de 16 bits. Si c'est quelque chose de faveur, ce qui précède ne suffira pas. Ensuite, vous avez besoin de plus de connaissances sur la manière dont le numéro est codé, afin de le décoder.

L'ordre dans lequel les octets élevés apparaissent sont déterminés par le Endansness du flux d'octets. En Big-Endian, vous verrez haut avant de basse (à une adresse inférieure), dans la petite Endian, c'est l'inverse.


1 commentaires

Vaut également la peine de noter: (haut << 8) | bas



0
votes

Si ces octets sont les "parties" d'un entier, cela fonctionne comme ça. Mais méfiez-vous que l'ordre des octets est spécifique à la plate-forme et qu'il dépend aussi de la longueur de l'entier (16 bits = 2 octets, 32 bits = 4bytes, ...)


0 commentaires

8
votes

Vous dites "Cette valeur est clairement 7", mais cela dépend entièrement du codage. Si nous assumons des octets pleine largeur, alors dans la petite-Endian, oui; 7, 0 est 7. Mais dans Big Endian, ce n'est pas le cas.

Pour Little-Endian, ce que vous voulez, c'est P>

int i = (byte[i] << 8) | byte[i+1];


1 commentaires

Bon point. Mais à partir de l'utilisation, je peux voir que la valeur est 7 (il y a sept autres sections de coordonnées dans le tableau.



23
votes

bitconverter peut facilement convertir les deux octets dans une valeur entière à deux octets: xxx


2 commentaires

@Macho Matt: Si vous souhaitez commenter une réponse déjà acceptée, il vaut mieux laisser un commentaire que de modifier la question elle-même. En outre, votre point n'était pas strictement précis - peu importe si le système informatique est BIG-Endian ou Little-Endian, il ne compte que si le système qui a créé à l'origine la matrice d'octet a une endansion différente de celle du système .NET code ici.


Cela suppose que le MSB de la représentation binaire de ces deux octets est le bit de signalisation (1 = -ve, 0 = + ve). Si ce n'est pas le cas, c'est-à-dire. Si le nombre n'est pas signé, vous devez utiliser ceci. Ushort num = bitconverter.touint16 (article, 4). Gardez également à l'esprit que cela aura des octets à l'index 5 comme le premier octet (octet le plus important) si votre architecture est petite Endian. Lire la réinventtingThewheel.Azurwebsites.net/twoscomplementTut.aspx Pour plus d'informations sur le bit des signes.



2
votes

Si vous voulez simplement mettre ces deux octets à côté de l'autre en format binaire, et voyez ce que ce nombre grand est en décimal, vous devez utiliser ce code:

if (BitConverter.IsLittleEndian)
{
    byte[] tempByteArray = new byte[2] { Item[5], Item[4] };
    ushort num = BitConverter.ToUInt16(tempByteArray, 0);
}
else
{
    ushort num = BitConverter.ToUInt16(Item, 4);
}


0 commentaires

0
votes

Si l'élément [5] est le MSB

  1. USHORT résultat = bitconverter.touint16 (nouvel octet [2] {élément [5], élément [4]}, 0);

  2. int résultat = 256 * Item [5] + élément [4];


0 commentaires