Если у меня есть метод, который принимает один байт красного, один байт из зеленого и один байт синего, и я знаю, что из каждого байта, если я извлекаю последние 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);
}
}
Только предложение: битовые маски намного легче читать в шестнадцатеричном формате. – John3136
Я все еще смущен, но я верю, что мой ответ прав. Чтобы получить красный (2, например, выше), вы используете red = someVal & 0x07. Серьезно: попытка объяснить, что вы делаете с кем-то другим, может помочь вам выявить проблему. Пока что объяснение кажется очень сложным для того, что должно быть тривиальным упражнением при манипулировании бит. – John3136