C++ 如何从EDID解析数字数据

C++ 如何从EDID解析数字数据,c++,parsing,string-parsing,edid,C++,Parsing,String Parsing,Edid,我有一种通过NVIDIAAPI获取监视器EDID信息的方法,这给了我一个128个未签名字符的数组。然而,当我读到EDID数据格式时,我注意到制造商ID(字节8-9)中的字母表示为5位数字,所以我不知道如何将其视为C++作为有意义的数据。 我的计划是定义一个结构类型,它与EDID的格式相匹配,并将char数组转换为该结构类型,但我不知道现在是否可能,因为我知道的C++中最小大小的数据类型是一个字节。 谢谢 比尔。为了提取和处理少于一个字节的信息,您需要使用 例如,为了提取存储为字符的第一个(最低有

我有一种通过NVIDIAAPI获取监视器EDID信息的方法,这给了我一个128个未签名字符的数组。然而,当我读到EDID数据格式时,我注意到制造商ID(字节8-9)中的字母表示为5位数字,所以我不知道如何将其视为C++作为有意义的数据。

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


比尔。

为了提取和处理少于一个字节的信息,您需要使用

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

unsigned char x = (BYTE & 0x1F);
它将存储由
x
中的
字节的右5位表示的值。在该示例中,我使用了AND运算符(C/C++中的
&
运算符),它基本上使用掩码来隐藏值的3个最高有效位(最左边的)位(使用十六进制值1F,它是二进制的
0001111
),隔离最初的5位

其他位运算符包括:OR,XOR,和左/右位移位,这是在C++中使用的<代码> < <代码> >代码> >代码> >代码> >代码和代码> <代码>操作符。< /P> < P>使用位操作(即移位)提取每个字符的位并使用查找表(为了更好的便携性)将它们转换为字符

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 ] }
uint16\u t EDID\u vendor\u ID=EDID[8]| EDID[9]>6和7],
字符LUT[(EDID供应商ID>>3)和7],
char\u LUT[(EDID\u供应商ID)&7]}

谢谢查尔斯,不过我还有一个问题。数据存储在字符数组中,因此我需要某种偏移量来读取数据,第一个数字是位0-4,第二个位是位5-9…这将是第一个字节的最后3位和第二个字节的第一位,等等。我不知道如何从图表中的某个偏移量开始读取,就像通常使用
[]
运算符在字符数组中处理偏移量一样。例如,如果要执行位操作来提取第二个字节的5位,可以说
array[1]&0x1F