2009-03-02 1 views
1

이미지를 비트 맵 파일로 쓰는 데 사용한 기존 코드가 있습니다. 코드 줄 중 하나는 다음과 같습니다.멀티 바이트 문자 상수 및 비트 맵 파일 헤더 유형 상수

bfh.bfType='MB'; 

아마 어딘가에서 복사 한 것 같습니다. 다른 개발자 중 한 명이 나에게 이렇게 말합니다. "옳지 않은가, BM이 아닌가?" 어쨌든 그것은 확인을 작동하는 것 않지만, 코드 리뷰에 이것에 리팩토링됩니다 :

bfh.bfType=*(WORD*)"BM"; 

Google 검색이 대부분의 시간, 첫 번째 줄, 사용하는 것을 나타냅니다

동안 시간 사람들의 어떤 것 다음을 수행하십시오 :

bfh.bfType=0x4D42; 

그래서 차이점은 무엇입니까? 그들은 모두 어떻게 정확한 결과를 낼 수 있습니까? 멀티 바이트 문자 상수는 무엇을 의미합니까? 그들은 정말로 똑같은가요?

답변

4

세 가지 모두 (아마도) 동일하지만, 다른 이유 때문입니다.

bfh.bfType=0x4D42; 

이 그냥 비트 8-15 ASCII 'M'과 비트 0-7에서 ASCII 'B'를 표현하기 위해 어떻게 숫자로 bfType를로드, 이해하기 간단합니다. 이것을 리틀 엔디 언 형식의 스트림에 써 넣으면 스트림에 'B', 'M'이 포함됩니다.

bfh.bfType='MB'; 

이것은 본질적으로 첫 번째 문장과 같습니다. 이것은 정수 상수를 표현하는 다른 방법 일뿐입니다. 아마도 컴파일러에 따라 다르지만, 컴파일 할 머신의 엔디안에 따라 값을 생성합니다. 같은 endian-ness의 머신에서 컴파일하고 실행하면, 스트림에 값을 쓸 때 'B', 'M'을 얻어야한다. 여기

bfh.bfType=*(WORD*)"BM"; 

는 "BM"는 'B', 'M', '\ 0'과 같은 데이터 블록을 생성하고 숯불 * 그것을 가리키는 얻을 컴파일러가.그런 다음 이것을 WORD *로 변환하여 참조 해제 될 때 메모리를 WORD로 읽습니다. 따라서 머신이 가지고있는 엔디안 유형에 관계없이 'B', 'M'을 bfType으로 읽습니다. 같은 endian-ness를 사용하여 그것을 작성하면 스트림에 'B', 'M'을 넣을 것입니다. bfType 만 사용하여 스트림에 쓰는 것이 가장 휴대용 버전입니다. 그러나 bfType과/etc를 비교하는 경우 endian-ness를 선택하고 값을 읽거나 쓸 때 필요에 따라 변환하는 것이 가장 좋습니다.

1

나는 API를 찾지 못했지만 http://cboard.cprogramming.com/showthread.php?t=24453에 따르면 bfType은 비트 맵 헤더입니다. BM 값은 "비트 맵"을 의미 할 가능성이 큽니다.

0x4D42는 16 진수 값 (M은 0x4D, B는 0x42D)입니다. little endian 작성 방법 (최소 유효 바이트 먼저)은 "BM"("MB"아님)과 같을 것입니다. "MB"와 함께 작동하는 경우 아마 일부 기본값이 사용됩니다.

0

부록의 포스트 tehvan에 :

위키 백과의 항목에서

BMP에 :

File header 참고 BMP 파일 형식 (따라서 BMP 헤더)의 처음 두 바이트는 큰에 저장됩니다 -endian order. 이것은 마술 번호 'BM'입니다. 다른 모든 정수 값은 리틀 엔디안 형식 (즉, 최하위 바이트 먼저)으로 저장됩니다.

사양에 따라 리팩토링 된 코드가 정확합니다.

몇 가지 다른 사진 편집기를 사용하여 'MB'라는 마법 번호로 파일을 열어 보았습니까?