2012-03-21 5 views
2

Если у меня есть метод, который принимает один байт красного, один байт из зеленого и один байт синего, и я знаю, что из каждого байта, если я извлекаю последние 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

Только предложение: битовые маски намного легче читать в шестнадцатеричном формате. – John3136

+0

Я все еще смущен, но я верю, что мой ответ прав. Чтобы получить красный (2, например, выше), вы используете red = someVal & 0x07. Серьезно: попытка объяснить, что вы делаете с кем-то другим, может помочь вам выявить проблему. Пока что объяснение кажется очень сложным для того, что должно быть тривиальным упражнением при манипулировании бит. – John3136

ответ

1

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

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
private const byte BValueMask = 224; // 11100000 

/* ... */ 

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

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

+1

Похоже, что OP предназначался для использования AND, а не для OR. –

+0

Конечно, эти биты все равно выбрасываются во время смены. –

2

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

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

red &= 0x07; 
green &= 0x03; 
blue &= 0x07; 
+0

hmm ... это, кажется, дает мне случайные значения, совсем не то, что я ищу, чтобы вернуться. Является способ, которым я пишу значения в байтах? – BigBug

+0

Случайные значения между 0-7 для синего и красного и 0-3 для зеленого? – John3136

+0

umm ... ну, например, строка, помещенная в изображение, - «2008» .. поэтому я ожидаю, что бит, который я собираю обратно из одного байта красного, один байт «Зеленый» и один байт «Синего», значение «2» в первом раунде ... однако, красный = «2», зеленый = «2» и синий = «1» ... – BigBug

Смежные вопросы