Как разобрать номера данных из EDID
У меня есть способ получения информации EDID мониторов с помощью API nVidia, это дает мне массив из 128 неподписанных символов. При чтении формата данных edid в Википедии, однако, я заметил, что буквы в идентификаторе производителя (байты 8-9) представлены в виде 5-битных чисел, поэтому я не знаю, как мне поступить с чтением этого в C++ как значимые данные,
Мой план состоял в том, чтобы просто определить тип структуры, который соответствует формату edid, и привести мой массив char к этому типу структуры, но я не знаю, возможно ли это сейчас, поскольку типы данных наименьшего размера, которые я знаю в C++, составляют один байт по размеру.
Благодарю.
Билл.
2 ответа
Для извлечения и манипулирования информацией, длина которой меньше одного байта, вам необходимо использовать побитовые операции.
Например, чтобы извлечь 5-битное число, сохраненное как первые (наименее значимые) 5-биты char
, ты мог бы сказать:
unsigned char x = (BYTE & 0x1F);
Который будет хранить значение, представленное правыми 5 битами BYTE
в x
, В этом примере я использовал оператор AND (&
оператор в C/C++), который в основном использует маску, чтобы скрыть 3 старших значащих (самых левых) бита значения (используя шестнадцатеричное значение 1F, которое 00011111
в двоичном коде) выделение начальных 5 бит.
Другие побитовые операторы включают OR, XOR и сдвиг битов влево / вправо, которые выполняются в C++ с использованием |
, ^
, <<
а также >>
операторы соответственно.
Используйте битовую манипуляцию (т. Е. Сдвиг), чтобы извлечь биты каждого символа и использовать таблицу поиска (для лучшей переносимости), чтобы преобразовать их в символы.
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 ] }