3

每个人都知道 BMP 文件是 little-endian 的。维基百科页面说前 2 个字节必须0x424D确保该文件是 BMP,但是当我从 BMP 文件中获取前 2 个字节时,它给了我两个字节的 reverse 0x4D42

我的代码:

FILE *file;
unsigned short bmpidentifier;

if((file = fopen("c://loser.bmp", "rb")) == NULL){
   perror("The problem is");
   return -1;
}

fread(&bmpidentifier, sizeof(unsigned short), 1, file);
if(bmpidentifier == 0x424D){
   printf("The file actually is a bmp file.\n");
} else{
   printf("%X\n", bmpidentifier);
   printf("The file is not a bmp file.\n");
}

现在,如何将 BMP 文件字节排序为 little-endian,并将前 2 个字节颠倒过来?

4

1 回答 1

4

第一个字节是'B'(0x42),第二个字节是'M'(0x4D)

小端序uint16_t会将此视为 0x4D42 ,这就是您正在阅读的内容。请尝试以下方法以获得与字节序无关的解决方案。

char BM[3];
BM[2] = '\0';
if (fread(BM, 1, 2, file) && (strcmp("BM",BM)==0)) {
  printf("The file actually is a bmp file.\n");
}

顺便说一句,Wiki 说“ID 字段(42h,4Dh)”,而不是“前 2 个字节必须是 0x424D”。

于 2013-08-21T02:37:42.397 回答