我有一种方法可以使用 nVidia API 获取监视器的 EDID 信息,这给了我一个 128 个无符号字符的数组。但是,在阅读维基百科上的 edid 数据格式时,我注意到制造商 ID(字节 8-9)中的字母表示为 5 位数字,所以我不知道如何将其作为有意义的数据读入 C++ .
我的计划是定义一个与 edid 格式匹配的结构类型,并将我的 char 数组转换为该结构类型,但我不知道现在是否可行,因为我在 C++ 中知道的最小大小的数据类型是一个字节在尺寸方面。
谢谢。
账单。
我有一种方法可以使用 nVidia API 获取监视器的 EDID 信息,这给了我一个 128 个无符号字符的数组。但是,在阅读维基百科上的 edid 数据格式时,我注意到制造商 ID(字节 8-9)中的字母表示为 5 位数字,所以我不知道如何将其作为有意义的数据读入 C++ .
我的计划是定义一个与 edid 格式匹配的结构类型,并将我的 char 数组转换为该结构类型,但我不知道现在是否可行,因为我在 C++ 中知道的最小大小的数据类型是一个字节在尺寸方面。
谢谢。
账单。
为了提取和操作小于一个字节的信息,您需要使用按位操作。
例如,为了提取存储为 a 的第一个(最低有效)5 位的 5 位数字char
,您可以说:
unsigned char x = (BYTE & 0x1F);
它将存储由 in 的右 5 位表示的BYTE
值x
。在那个例子中,我使用了一个 AND 运算符(&
C/C++ 中的运算符),它基本上使用掩码来隐藏值的 3 个最重要(最左边)位,(使用十六进制值 1F,它00011111
位于二进制)隔离最初的 5 位。
其他按位运算符包括 OR、XOR 和左/右位移,它们在 C++ 中分别使用、 和|
运算^
符执行。<<
>>
使用位操作(即移位)来提取每个字符的位并使用查找表(为了更好的可移植性)将它们转换为字符。
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 ] }