如何解析来自 EDID 的数字数据
How to parse numbers data from EDID
我有一种方法可以使用 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 ] }
相关文章:
- 当使用比格式支持的精度更高的精度来显示数字时,会写出什么数据
- 使用 std::locale 格式化法语数字时无效的 UTF-8 数据
- 用于筛子的最佳数据结构是什么(即一些被划掉的数字列表)?
- 尝试使用 ifstream 读取数据后显示不正确的数字
- C++,打开和编辑文本文件中的数字数据,并将结果放入新文件中
- 从文件中读取带有空格和数字数据的文本
- 创建一个带有限制的数字数据类型,一个介于 -10 和 10 之间的整数
- 将映射的每个键中的数字数据与另一个数值进行比较
- 为具有一个数字数据成员的类定义所有比较运算符的方便方法
- (c++)从txt文件中读取列中的数字数据并确定最高值
- 如何在不使用 atof 函数的情况下将命令行添加为数字数据
- 如何解析来自 EDID 的数字数据
- 从C++文件中读取不同类型的数字数据
- 如何强制流根据类型写入数字数据
- 为什么我将数字数据从文本文件导入二维数组的代码不起作用
- 用C++读取表格中的数字数据,代码行数最少
- C++中的数字数据验证
- 如何将数字数据序列化为char*
- 将数字数据以二进制形式写入文件,而不是写出
- 通过TCP/IP以太网发送数字数据