2012-04-17 2 views
0

У меня есть способ получить информацию EDID о мониторах с nVidia API, это дает мне массив из 128 неподписанных символов. Однако при чтении в формате данных edid на wikipedia я заметил, что буквы в идентификаторе производителя (байты 8-9) представлены в виде 5-битных чисел, поэтому я не знаю, как я читаю это на C++ в качестве значимых данных ,Как разбирать данные чисел из EDID

Мой план состоял в том, чтобы просто определить тип структуры, который соответствовал формату edid, и передать мой массив char этому типу структуры, но я не знаю, возможно ли это сейчас, начиная с самых маленьких типов данных, которые я знаю в C++ имеют размер по одному байту.

Спасибо.

Bill.

ответ

2

Для извлечения и обработки информации, которая меньше одного байта, вам необходимо использовать bit-wise operations.

Например, для того, чтобы извлечь 5-разрядное число, сохраненное в качестве первого (наименее значащих) 5-битов char, вы могли бы сказать:

unsigned char x = (BYTE & 0x1F); 

Что будет хранить значение, представленное правые 5 бит BYTE в x. В этом примере я использовал оператор И (оператор & в C/C++), который в основном использует маску, чтобы скрыть 3 наиболее значимых (слева) бита значения (с использованием шестнадцатеричного значения 1F, которое 00011111 в двоичном виде), изолируя исходные 5 бит.

Другие Битовые операторы включают ИЛИ, исключающее ИЛИ, и левый/правый битовый сдвиг, которые выполняются в C++ с использованием операторов |, ^, << и >> соответственно.

+0

Спасибо, Чарльз, у меня есть еще один вопрос. Данные хранятся в массиве символов, поэтому мне потребуется какой-то смещение, из которого можно считывать данные, первое число - это бит 0-4, второй бит - бит 5-9 ... так что это будет последний 3 бита первого байта и первый бит второго байта и т. Д. Я не знаю, как я начну читать из некоторого смещения от char –

+0

Точно так же вы должны обращаться к смещению в массиве символов обычно, используя '[]' оператор. Если вы хотите выполнить бит операцию для извлечения 5 бит второго байта, например, вы можете сказать 'array [1] & 0x1F' –

0

Используйте бит-манипуляцию (т. Е. Сдвиг), чтобы извлекать биты каждого символа и использовать таблицу поиска (для лучшей переносимости), чтобы преобразовать их в символы.

uint16_t EDID_vendor_ID = EDID[8] | EDID[9] << 8; 
char char_LUT[]={' ', 'A', 'B', /*...*/ 'Z'}; 
char ID[3] = { char_LUT[ (EDID_vendor_ID >> 6) & 7 ], 
       char_LUT[ (EDID_vendor_ID >> 3) & 7 ], 
       char_LUT[ (EDID_vendor_ID ) & 7 ] } 
Смежные вопросы