9
votes

Comment lire les 4 premiers et les 4 derniers bits d'octets?

C # Comment lire les 4 premiers et les 4 derniers bits d'octets?


3 commentaires

Veuillez poster le code que vous avez essayé et expliquer où vous êtes coincé.


Je n'ai aucun code, je dois juste savoir comment


Eh bien, nous espérons certains efforts ici avant que la question soit postée et que la question indique l'effort.


4 Réponses :


33
votes

Utiliser Bitwise et code> et décalage, comme celui-ci:

byte b = 0xAB;
var low = b & 0x0F;
var high = b >> 4;


2 commentaires

Est-ce nécessaire et éteindre les 4 bits les plus élevés après le passage?


@Martinjames vous êtes correct, et éteint le reste n'est pas nécessaire, car c # ne fait pas de soupire étend les octets . Merci!



1
votes

dans une structure pratique:

Utilisation h3> xxx pré>

code h3> xxx pré>

bonus: tableau (non testé)

Si vous avez besoin d'utiliser un tableau de ces demi-octets, cela simplifiera l'accès: P>

public class HalvedByteArray
{
    public int Capacity { get; private set; }
    public HalvedByte[] Array { get; private set; }

    public byte this[int index]
    {
        get
        {
            if (index < 0 || index >= Capacity)
            {
                throw new IndexOutOfRangeException();
            }

            var hb = Array[index / 2];

            return (index % 2 == 0) ? hb.Low : hb.High;
        }
        set
        {
            if (index < 0 || index >= Capacity)
            {
                throw new IndexOutOfRangeException();
            }

            var hb = Array[index / 2];

            if (index % 2 == 0)
            {
                hb.Low = value;
            }
            else
            {
                hb.High = value;
            }
        }
    }

    public HalvedByteArray(int capacity)
    {
        if (capacity < 0)
        {
            throw new ArgumentException("Capacity must be positive.", "capacity");
        }

        Capacity = capacity;
        Array = new HalvedByte[capacity / 2];
    }
}


0 commentaires

5
votes

Je préférerais simplement utiliser cela -

byte a = 68;
byte high_bits = a>>4;
byte low_bits = a&15;


0 commentaires

0
votes

Méthode simple pour le faire.

Exemple Utilisez: P>

A: 10101110 P>

B: 00001110 P>

Obtenez 4 bits de la dernière Cette sortie est comme B P>

GetBitRange (10101110, 0, 4); P>

//gets a bits from a byte, and return a byte of the new bits
byte getBitRange(byte data, int start, int _end){

//shift binary to starting point of range
byte shifted = (data >> start);

//calculate range length (+1 for 0 index)
int rangeLength = (_end-start)+1;

//get binary mask based on range length 
byte maskBinary;
 
switch (rangeLength){
case 1: maskBinary = 0b00000001; break;
case 2: maskBinary = 0b00000011; break;
case 3: maskBinary = 0b00000111; break;
case 4: maskBinary = 0b00001111; break;
case 5: maskBinary = 0b00011111; break;
case 6: maskBinary = 0b00111111; break;
case 7: maskBinary = 0b01111111; break;
case 8: maskBinary = 0b11111111; break;
default:
  // default statements
  Serial.println("Error: Range length too long!!");
}

//cancel out 
byte finalByte = (shifted & maskBinary);

return finalByte;
}


1 commentaires

Ce code a été écrit en C, mais avec des modifications mineures, elle fonctionnera pour C #