2012-04-17 91 views
0

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

我的计划是只定义其匹配EDID的格式和投我的字符数组该结构类型结构类型,但我不知道现在是可能的,因为我知道在最小尺寸的数据类型C++的大小是一个字节。

谢谢。

Bill。

回答

2

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

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

unsigned char x = (BYTE & 0x1F); 

将存储由所表示的值​​的右边5位x。在这个例子中,我使用了AND运算符(C/C++中的&运算符),它基本上使用掩码来隐藏值的3个最重要的(最左边的)位(使用十六进制值1F,即00011111二进制)隔离最初的5位。

其他位运算符包括OR,XOR,和左/右位移,其分别使用|^<<>>运营商下进行++。

+0

感谢查尔斯,我还有一个问题,虽然。数据存储在一个char数组中,所以我需要某种偏移量来读取数据,第一个数位是0-4位,第二个位是5-9位......所以这将是最后一个数据位第一个字节的3位和第二个字节的第一个位等等。我不知道如何从一个字符的某个偏移处开始读取。 – 2012-04-17 12:27:18

+0

用同样的方法可以解决char数组中偏移量的问题, '[]'操作员。例如,如果您想执行一个位操作来提取第二个字节的5位,则可以说'array [1]&0x1F' – 2012-04-17 12:28:36

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 ] }