나는이 정확한 행동에 대답하는 질문을 찾지 못했습니다. 어떻게 된 일인지 이해하지 못했습니다.C/C++ : char []의 int 변환이 실패하고, unsigned char []가 int로 변환됩니다. 이유는 무엇입니까?
Windows 비트 맵 파일 (bmp)의 내용을 배열로 읽고이 배열을 사용합니다 이 후
char biHeader[40];
// ...
source.read(biHeader,40);
// ...
int biHeight = biHeader[8] | (biHeader[9] << 8) | (biHeader[10] << 16) | (biHeader[11] << 24);
, 그것은 400
을해야하기 때문에 완전히 잘못 -112
로 biHeight
쇼 : 나중에 필요한 정보를 추출합니다. 그래서 파일의 16 진수 덤프를 살펴 보았습니다. 읽은 내용은 다음과 같습니다 예상대로 큰 엔디안 바이트 순서를 변경
90 01 00 00
, 진수 400
입니다 0x190
을 제공합니다.
내가에 위의 코드를 변경하는 경우 :
unsigned char biHeader[40];
// ...
source.read((char*)biHeader,40);
// ...
int biHeight = ... (same as before)
... 그럼 내가 예상 가치를 얻을. 여기서 무슨 일이 일어나고있는거야?
그리고이 데이터를 어떻게 읽으시겠습니까?
한 가지 더 : 값이 음수 일 수 있으므로 int로 변환해야하며 부호없는 int로 변환해야합니다! –
일반적으로 BITMAPINFOHEADER는 구조체로 읽 힙니다. 여기서 biHeight는 Windows 플랫폼에서 LONG입니다. 적어도 – Chubsdad
이 헤더의 여러 버전 (끝으로 다른 필드가 있음)이 있기 때문에 구조체로 읽지 않기로했습니다. LONG? 파일 형식 정의에 따르면 이것은 잘못된 것입니다. 또는 더 구체적으로 : biHeight는 4 바이트로 구성됩니다 (길이는 8 바이트가 될 수 있음) –