如何从EDID解析数字数据

时间:2012-04-17 12:15:06

标签: c++ parsing string-parsing edid

我有办法用nVidia API获取监视器的EDID信息,这给了我一个128个无符号字符的数组。在wikipedia上阅读edid数据格式时,我注意到制造商ID(字节8-9)中的字母表示为5位数,所以我不知道如何将其读入C ++是有意义的数据。

我的计划是定义一个与edid的格式匹配的结构类型,并将我的char数组转换为该结构类型,但我不知道现在是否可能,因为我在C ++中知道的最小的数据类型是一个字节大小。

感谢。

比尔。

2 个答案:

答案 0 :(得分:2)

为了提取和处理小于一个字节的信息,您需要使用bit-wise operations

例如,为了提取存储为char的第一个(最低有效)5位的5位数,您可以说:

unsigned char x = (BYTE & 0x1F);

这将存储BYTEx的右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 ] }