2012-04-17 47 views
0

我有一種獲得nVidia API監視器的EDID信息的方法,這給了我一個128個無符號字符的數組。當讀到wikipedia上的edid數據格式時,我注意到製造商ID(字節8-9)中的字母表示爲5位數字,所以我不知道如何將它讀入C++作爲有意義的數據。如何從EDID解析數字數據

我的計劃是隻定義其匹配EDID的格式和投我的字符數組該結構類型結構類型,但我不知道現在是可能的,因爲我知道在最小尺寸的數據類型C++的大小是一個字節。

謝謝。

Bill。

回答

2

爲了提取和處理小於一個字節的信息,您需要使用bit-wise operations

例如,爲了提取存儲爲第一(最低顯著)一個char的5位的5位數字,可以說:

unsigned char x = (BYTE & 0x1F); 

將存儲由所表示的值​​的右邊5位x。在這個例子中,我使用了AND運算符(C/C++中的&運算符),它基本上使用掩碼來隱藏值的3個最重要的(最左邊的)位(使用十六進制值1F,即00011111二進制)隔離最初的5位。

其他位運算符包括OR,XOR,和左/右位移,其分別使用|^<<>>運營商下進行++。

+0

感謝查爾斯,我還有一個問題,雖然。數據存儲在一個char數組中,所以我需要某種偏移量來讀取數據,第一個數位是0-4位,第二個位是5-9位......所以這將是最後一個數據位第一個字節的3位和第二個字節的第一個位等等。我不知道如何從一個字符的某個偏移處開始讀取。 – 2012-04-17 12:27:18

+0

用同樣的方法可以解決char數組中偏移量的問題, '[]'操作員。例如,如果您想執行一個位操作來提取第二個字節的5位,則可以說'array [1]&0x1F' – 2012-04-17 12:28:36

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 ] }