получение значений из байта - PullRequest
2 голосов
/ 21 марта 2012

Если у меня есть метод, который принимает один байт красного, один байт зеленого и один байт синего, и я знаю, что из каждого байта, если я извлекаю последние 3 бита в красном байте, последние 2 бита взеленый байт и последние 3 бита в синем байте, как мне это сделать?Я использовал код ниже, но он не совсем работает.Что я здесь не так делаю?

    private const byte InverseBlueMask = 7; // 00000111
    private const byte InverseGreenMask = 3; // 00000011
    private const byte InverseRedMask = 7; //  00000111

    //private const byte InverseBValueMask = 31; // 00011111
    //private const byte InverseGValueMask = 231; // 11100111
    //private const byte InverseRValueMask = 248; //  11111000



  public void getEachBitOfMessage(byte byteToManipulate, int colour)
    {
        byte value = 0;
        byte returnByte = 0; 


        if (colour == BLUE)
        {
            value = (byte)(byteToManipulate | BValueMask);
            value = (byte)(value >> 5);
            returnByte = (byte)(byteToManipulate | InverseBlueMask);
            returnByte = (byte)(returnByte & value);
            String theByte = returnByte.ToString(); 

        }
        else if (colour == GREEN)
        {
            value = (byte)(byteToManipulate | GValueMask);
            value = (byte)(value >> 3);
            returnByte = (byte)(byteToManipulate | InverseGreenMask);
            returnByte = (byte)(returnByte & value);
            String theByte = returnByte.ToString(); 

        }
        else if (colour == RED)
        {
            value = (byte)(byteToManipulate | RValueMask);
            returnByte = (byte)(byteToManipulate | InverseRedMask);
            returnByte = (byte)(returnByte & value);
            String theByte = returnByte.ToString(); 

        }
     }

Этот метод я использую для помещения битов сообщения в каждый байт цвета.

    private const byte BlueMask = 248; // 11111000
    private const byte GreenMask = 252; // 11111100
    private const byte RedMask = 248; //  11111000
    private const byte BValueMask = 224; // 11100000
    private const byte GValueMask = 24; // 00011000
    private const byte RValueMask = 7; //  00000111



     public byte changeEachBit(byte byteToManipulate, int colour, byte theMessage)
     {

        byte value = 0;
        byte returnByte = 0; 

        if (colour == BLUE)
        {
           value= (byte)(theMessage & BValueMask);
           value = (byte)(value >> 5); 
           returnByte = (byte)(byteToManipulate & BlueMask);
           returnByte = (byte)(returnByte | value); 

        }
        else if (colour == GREEN)
        {
            value = (byte)(theMessage & GValueMask);
            value = (byte)(value >> 3);
            returnByte = (byte)(byteToManipulate & GreenMask);
            returnByte = (byte)(returnByte | value);

        }
        else if (colour == RED)
        {
            value = (byte)(theMessage & RValueMask);
            returnByte = (byte)(byteToManipulate & RedMask);
            returnByte = (byte)(returnByte | value);

        }
     }

Ответы [ 3 ]

2 голосов
/ 21 марта 2012

Из каждого байта, если я извлеку последние 3 бита в красном байте, последние 2 бита в зеленом байте и последние 3 бита в синем байте, как бы я это сделал?

Это замаскирует все, кроме младших n битов, которые вы просили.

red &= 0x07;
green &= 0x03;
blue &= 0x07;
1 голос
/ 21 марта 2012

Это работает ..

    private const byte InverseBlueMask = 7; // 00000111
    private const byte InverseGreenMask = 3; // 00000011
    private const byte InverseRedMask = 7; //  00000111

    public void getEachBitOfMessage(byte byteToManipulate, int colour)
    {
        byte value = 0;

        if (countToByte == 3)
        {
            byte blueAreaInTotal = 0;
            byte greenAreaInTotal = 0;
            byte redAreaInTotal = 0;
            byte total = 0; 

            redAreaInTotal = (byte)(redCount);
            blueAreaInTotal = (byte)(blueCount << 5);
            greenAreaInTotal = (byte)(greenCount << 3);

            total = (byte)(total | redAreaInTotal); 
            total = (byte)(total | blueAreaInTotal);
            total = (byte)(total | greenAreaInTotal); 
            convertToChar(total);

            redCount = 0;
            blueCount = 0;
            greenCount = 0; 
            countToByte = 0; 
        }

        if (colour == BLUE)
        {
            value = (byte)(byteToManipulate & InverseBlueMask);
            blueCount = value; 
        }
        else if (colour == GREEN)
        {
            value = (byte)(byteToManipulate & InverseGreenMask);
            greenCount = value; 

        }
        else if (colour == RED)
        {
            value = (byte)(byteToManipulate & InverseRedMask);
            redCount = value; 
        }

        countToByte++; 
    }
0 голосов
/ 21 марта 2012
private const byte BValueMask = 224; // 11100000

/* ... */

    if (colour == BLUE)
    {
        value = (byte)(byteToManipulate | BValueMask);
        value = (byte)(value >> 5);

Эффект здесь состоит в том, чтобы включить верхние три бита, а затем выбросить нижние пять битов. С таким же успехом вы можете написать: value = 7;. Возможно, эти три набора операторов были предназначены для использования другой маски или для использования другой битовой операции?

...