2012-04-17 18 views
0

nVidia APIを使用してモニタのEDID情報を取得する方法があります。これは128個の符号なし文字の配列を返します。しかし、edidのデータフォーマットをwikipediaに読み上げると、私はメーカーのID(バイト8-9)の文字は5ビットの数字で表されていることに気がついたので、意味のあるデータとしてC++に読み込む方法は分かりません。EDIDから数値データを解析する方法

私の計画では、edidのフォーマットにマッチしたstruct型を定義して、そのchar型配列をそのstruct型にキャストしていましたが、私が知っている最小サイズのデータ​​型C++は1バイトのサイズです。

ありがとうございました。

ビル。

答えて

2

1バイト未満の情報を抽出して操作するには、bit-wise operationsを使用する必要があります。

例えば、charの最初の(最下位)5ビットとして格納され、5ビット数を抽出するために、あなたが言うことができる:

unsigned char x = (BYTE & 0x1F); 

を表す値を格納するどの​​の右の5ビットはxです。この例では、AND演算子(C/C++では&演算子)を使用しました。この演算子は、基本的にマスクを使用して値の3つの最上位(左端)ビットを非表示にします(16進値1Fを使用します)。 2進で00011111)、最初の5ビットを分離する。

他のビット演算子がOR、XOR、それぞれ|^<<>>演算子を使用して、C++で実行される左/右ビットシフトを含みます。

+0

チャールズさんに感謝します。データはchar配列に格納されているので、データを読み込むためのオフセットが必要です。最初の数値はビット0〜4、2番目のビットはビット5〜9 ...ですので、最後の数値になります最初のバイトの3ビットと2番目のバイトの最初のビットなど。私はどのように私は文字からいくつかのオフセットからの読み取りを開始するだろうか分からない –

+0

通常は、 '[]'演算子。たとえば、2バイト目の5ビットを抽出するビット操作を実行する場合は、 'array [1]&0x1F'と言うことができます –

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 ] } 
関連する問題