如何解析来自 EDID 的数字数据

How to parse numbers data from EDID

本文关键字:数字 数据 EDID 何解析      更新时间:2023-10-16

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

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

谢谢。

法案。

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

例如,为了提取存储为char的第一个(最不重要的)5位的5位数字,您可以说:

unsigned char x = (BYTE & 0x1F);

它将在x中存储由正确的 5 位BYTE表示的值。 在该示例中,我使用了 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 ] }