0

nVidia APIを使用してモニターのEDID情報を取得する方法があります。これにより、128個の符号なし文字の配列が得られます。しかし、ウィキペディアでedidデータ形式を読んでいると、製造元IDの文字(バイト8〜9)が5ビットの数値で表されていることに気付きました。そのため、意味のあるデータとしてC++に読み取る方法がわかりません。 。

私の計画は、edidの形式に一致する構造体型を定義し、char配列をその構造体型にキャストすることでしたが、C ++で知っている最小サイズのデータ​​型は1バイトであるため、それが可能かどうかはわかりません。サイズで。

ありがとう。

明細書。

4

2 に答える 2

2

1バイト未満の情報を抽出して操作するには、ビット単位の演算を使用する必要があります。

たとえば、の最初の(最下位)5ビットとして格納されている5ビットの数値を抽出するにはchar、次のように言うことができます。

unsigned char x = (BYTE & 0x1F);

これは、の右5ビットで表される値を格納しBYTEますx。その例では、AND演算子(&C / C ++の演算子)を使用しました。これは基本的にマスクを使用して、値の最上位(左端)の3ビットを非表示にします(16進値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 に答える