我有办法用nVidia API获取监视器的EDID信息,这给了我一个128个无符号字符的数组。在wikipedia上阅读edid数据格式时,我注意到制造商ID(字节8-9)中的字母表示为5位数,所以我不知道如何将其读入C ++是有意义的数据。
我的计划是定义一个与edid的格式匹配的结构类型,并将我的char数组转换为该结构类型,但我不知道现在是否可能,因为我在C ++中知道的最小的数据类型是一个字节大小。
感谢。
比尔。
答案 0 :(得分:2)
为了提取和处理小于一个字节的信息,您需要使用bit-wise operations。
例如,为了提取存储为char
的第一个(最低有效)5位的5位数,您可以说:
unsigned char x = (BYTE & 0x1F);
这将存储BYTE
中x
的右5位所代表的值。在该示例中,我使用AND运算符(C / C ++中的&
运算符),它基本上使用掩码来隐藏值的3个最重要(最左侧)位,(使用十六进制值) 1F,二进制00011111
隔离最初的5位。
其他按位运算符包括OR,XOR和左/右位移,它们使用|
,^
,<<
和>>
运算符在C ++中执行分别
答案 1 :(得分: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 ] }