Comment travailler avec les bits d’un octet

J’ai un seul octet qui contient deux valeurs. Voici la documentation:

L’octet d’autorité est divisé en deux champs. Les trois bits de poids faible portent le niveau d’autorité de l’utilisateur (0-5). Les cinq bits les plus significatifs portent un seuil de rejet prioritaire. Si ces bits sont mis à zéro, le seuil de rejet du système est utilisé pour déterminer si un score pour cet utilisateur est considéré comme un accept ou un rejet. S’ils ne sont pas nuls, la valeur de ces bits multipliée par dix sera le score seuil pour cet utilisateur.

Octet de l’autorité:

7 6 5 4 3 ......... 2 1 0 Reject Threshold .. Authority 

Je n’ai aucune expérience de travail avec des bits en C #.

Quelqu’un peut-il m’aider s’il vous plaît à convertir un octet et obtenir les valeurs mentionnées ci-dessus?

J’ai essayé le code suivant:

 BitArray BA = new BitArray(mybyte); 

Mais la longueur revient à 29 et j’aurais prévu 8, chaque bit étant dans l’octet.

– Merci pour l’aide rapide de chacun. Je l’ai obtenu maintenant! Internet génial.

Au lieu de BitArray , vous pouvez plus facilement utiliser l’opérateur AND et au décalage à droite intégré au niveau du bit comme suit:

 byte authorityByte = ... int authorityLevel = authorityByte & 7; int rejectThreshold = authorityByte >> 3; 

Pour récupérer l’octet simple, vous pouvez utiliser l’opérateur au niveau du bit OU et l’opérateur de décalage à gauche :

 int authorityLevel = ... int rejectThreshold = ... Debug.Assert(authorityLevel >= 0 && authorityLevel <= 7); Debug.Assert(rejectThreshold >= 0 && rejectThreshold <= 31); byte authorityByte = (byte)((rejectThreshold << 3) | authorityLevel); 

Votre utilisation de BitArray est incorrecte. Ce:

 BitArray BA = new BitArray(mybyte); 

..will être implicitement converti en un int . Lorsque cela se produit, vous déclenchez ce constructeur:

 BitArray(int length); 

..therefore, sa création avec une longueur spécifique.

En regardant MSDN ( http://msdn.microsoft.com/en-us/library/x1xda43a.aspx ), vous voulez ceci:

 BitArray BA = new BitArray(new byte[] { myByte }); 

La longueur sera alors de 8 (comme prévu).

Pour obtenir la valeur des cinq bits les plus significatifs d’un octet sous forme d’entier, décalez l’octet de 3 à droite (c’est-à-dire de 8-5 à 8-5 ) et définissez les trois bits supérieurs à zéro en utilisant l’opération AND bit, comme ceci:

 byte orig = ... int rejThreshold = (orig >> 3) & 0x1F; 
  • >> est l’opérateur “shift right”. Il déplace les bits 7..3 vers les positions 4..0 en laissant tomber les trois bits inférieurs.
  • 0x1F est le nombre binary 00011111 , dont les trois bits supérieurs sont mis à zéro et les cinq bits inférieurs à un. AND -ing avec ce nombre zéros sur trois bits supérieurs.

Cette technique peut être généralisée pour obtenir d’autres modèles de bits et d’autres types de données intégrales. Vous déplacez les bits de votre choix dans la position la moins significative et appliquez un masque qui “supprime” le nombre de bits que vous souhaitez. Dans certains cas, le décalage ne serait pas nécessaire (par exemple, lorsque vous obtenez le groupe de bits le moins significatif). Dans d’autres cas, tels que ceux décrits ci-dessus, le masquage ne serait pas nécessaire, car vous obtenez le groupe de bits le plus significatif dans un type non signé (si le type est signé, AND serait requirejs).

Vous utilisez le mauvais constructeur (probablement).

Celui que vous utilisez est probablement celui-ci , alors que vous en avez besoin:

 var bitArray = new BitArray(new [] { myByte } );