2012-04-17 7 views
0

nVidia API를 사용하여 모니터의 EDID 정보를 얻는 방법은 128 개의 서명되지 않은 문자 배열을 제공합니다. 그러나 edid 데이터 형식을 wikipedia에서 읽었을 때 제조사 ID (바이트 8-9)의 문자가 5 비트 숫자로 표시되어 C++로 의미있는 데이터로 읽는 방법을 알지 못합니다. .EDID에서 숫자 데이터를 구문 분석하는 방법

나의 계획은 단지 edid의 형식과 일치하는 구조체 유형을 정의하고 구조체 유형으로 내 char 배열을 형 변환하는 것이었지만 지금 알고있는 가장 작은 크기의 데이터 유형 C++은 1 바이트 크기입니다.

감사합니다.

빌.

답변

2

1 바이트 미만의 정보를 추출하고 조작하려면 bit-wise operations을 사용해야합니다.

예를 들어, char의 제 (최하위) 5 비트로 저장된 5 비트 값을 추출하기 위해서는 말할 수 :

unsigned char x = (BYTE & 0x1F); 

를 나타내는 값을 저장하는 것 어느 BYTE의 오른쪽 5 비트는 x입니다. 이 예제에서, AND 연산자 (C/C++에서 & 연산자)를 사용했습니다.이 연산자는 기본적으로 마스크를 사용하여 3 개의 최상위 비트 (가장 왼쪽)를 숨 깁니다 (16 진수 1F 사용). 00011111 바이너리)를 사용하여 초기 5 비트를 분리합니다.

다른 비트 연산자는 각각 |, ^, <<>> 및 연산자를 사용하여 C++에서 수행 OR, XOR 및 좌측/우측 비트 - 시프트를 포함한다.

+0

찰스 고마워, 나는 또 다른 질문이있다. 데이터는 char 배열에 저장되므로 데이터를 읽는 데 필요한 일종의 오프셋이 필요합니다. 첫 번째 숫자는 비트 0-4이고, 두 번째 비트는 비트 5-9 ... 그래서 마지막 문자가됩니다. 첫 번째 바이트의 3 비트와 두 번째 바이트의 첫 번째 비트 등. 나는 숯에서 오프셋을 읽는 방법을 모르겠다. –

+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 ] } 
관련 문제