我有一种方法可以用nVidia接口获取显示器的EDID信息,这给了我一个128个无符号字符的数组。然而,当我在wikipedia上阅读edid数据格式时,我注意到制造商id (字节8-9)中的字母表示为5位数字,因此我不知道如何将其作为有意义的数据读取到C++中。
我的计划是只定义一个与edid格式匹配的结构类型,并将我的字符数组转换为该结构类型,但我不知道现在是否可能,因为我所知的C++中最小大小的数据类型是一个字节。
谢谢。
比尔。
发布于 2012-04-17 20:19:43
为了提取和操作少于一个字节的信息,您需要使用bit-wise operations。
例如,为了提取存储为char的第一个(最低有效)5位的5位数字,您可以这样说:
unsigned char x = (BYTE & 0x1F);其将在x中存储由BYTE的右5比特表示的值。在该示例中,我使用了AND运算符(C/C++中的&运算符),它基本上使用掩码来隐藏值的3个最高有效位(最左侧),(使用十六进制值1F,它在二进制中是00011111 )来隔离最初的5位。
其他按位运算符包括OR、XOR和左/右位移位,它们在C++中分别使用|、^、<<和>>运算符执行。
发布于 2012-04-17 20:22:51
使用位操作(即移位)提取每个字符的位,并使用查找表(为了更好的可移植性)将它们转换为字符。
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 ] }https://stackoverflow.com/questions/10191049
复制相似问题