bmp 文件字节如何按小端排序,并给我反向的前 2 个字节?

Lio*_*ing 3 c bmp readfile

大家都知道 BMP 文件是小端字节序的。维基百科页面说前 2 个字节必须是0x424D为了确保该文件是 BMP,但是当我从 BMP 文件获取前 2 个字节时,它给了我相反的两个字节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");
}
Run Code Online (Sandbox Code Playgroud)

现在,BMP 文件字节如何按小端排序,并给我反转的前 2 个字节?

chu*_*ica 5

第一个字节是“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");
}
Run Code Online (Sandbox Code Playgroud)

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

  • @LionKing Little endian 意味着多字节数据类型的字节(例如:大多数系统上的“int”现在是 32 位,因此 4 个字节)从*最低*有效字节(低 8 位)到*最有效字节按顺序存储* 有效字节(*最高*八位)。例如 2059145780,其十六进制为 0x7ABC1234。小尾数系统中字节存储为“0x34 0x12 0xBC 0x7A”。大端存储为“0x7A 0xBC 0x12 0x34”。(对于这个答案,+1,尽管我只是在将字节读入“unsigned char”数组块后一一检查字节。无论如何都不需要“strcmp()”)。 (3认同)