0

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

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

谢谢。

账单。

4

2 回答 2

2

为了提取和操作小于一个字节的信息,您需要使用按位操作

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

unsigned char x = (BYTE & 0x1F);

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

其他按位运算符包括 OR、XOR 和左/右位移,它们在 C++ 中分别使用、 和|运算^符执行。<<>>

于 2012-04-17T12:19:42.763 回答
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 ] }
于 2012-04-17T12:22:51.087 回答