尝试将位图文件读取为十六进制

时间:2016-11-19 20:40:02

标签: c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define NBRCOLOURS 16
#define COLOURSIZE 8

typedef struct
{
    char colours[COLOURSIZE];

}BITMAP;



//Main Function
void main(void)
{
    int count, count2;
    char bm_file[] = "C:\\Coding\\Bitmap Program\\Sample.bmp";
    FILE *fptr;
    char ch;
    int i = 0;
    BITMAP bm_data[NBRCOLOURS];


    fptr = fopen(bm_file, "rb");
    if (fptr != NULL)
    {
        while ((ch = fgetc(fptr)) != EOF)
        {
            printf("%02X ", ch);
            if (!(++i % 16)) putc('\n', stdout);
        }
    }

    fclose(fptr);

    system("pause");
    return;
}

我正在使用这个代码,我发现它主要是在线尝试读取位图文件的内容作为其十六进制值。出于某种原因,这个代码在标题的末尾停止,不幸的是最终我需要计算每种颜色出现的次数,以便我可以找出哪种颜色最多,哪种颜色最少。

如果有人能告诉我为什么这个代码在位图的标题末尾停止,或者导致我能够将剩余的十六进制数据从文件中拉出来,我真的很感激。

这是十六进制代码:

42 4D C6 00 00 00 00 00 00 00 76 00 00 00 28 00 
00 00 0A 00 00 00 0A 00 00 00 01 00 04 00 00 00 
00 00 50 00 00 00 12 0B 00 00 12 0B 00 00 10 00 
00 00 10 00 00 00 FF 00 00 00 00 FF 00 00 00 00 
42 00 5A 5A 84 00 00 00 FF 00 FF 00 FF 00 00 FF 
FF 00 08 FF FF 00 5A FF FF 00 FF FF FF 00 FF FF 
FF 00 FF FF FF 00 FF FF FF 00 FF FF FF 00 FF FF 
FF 00 FF FF FF 00 92 59 00 16 47 00 00 00 25 90 
01 64 61 00 00 00 59 90 11 64 61 00 00 00 99 00 
16 48 11 00 00 00 90 01 64 61 11 00 00 00 00 16 
64 61 00 00 00 00 01 16 46 10 09 00 00 00 11 64 
41 00 99 00 00 00 16 64 11 09 95 00 00 00 66 48 
10 09 53 00 00 00

以下是印刷品:

42 4D FFFFFFC6 00 00 00 00 00 00 00 76 00 00 00 28 00 
00 00 0A 00 00 00 0A 00 00 00 01 00 04 00 00 00 
00 00 50 00 00 00 12 0B 00 00 12 0B 00 00 10 00 
00 00 10 00 00 00

很长的帖子,对不起。非常感谢任何帮助。

2 个答案:

答案 0 :(得分:3)

fgetc返回一个int,而不是一个char。您不能使用char表示EOF,因为char的所有可能值都是有效的。 EOF(我认为)-1表示为int或0xfffffff,因此如果您将0xff作为char读取,则它与EOF相同。

改变这个:

char ch;

为:

int ch;

答案 1 :(得分:0)

printf中格式说明符之前的数字,如%02X,仅保证最小输出的字符数,而不是最大值。 fgetc会返回int,而非char。如果int是负二的补码,则表示int的整个bitstring将被打印,包括开始时的FF个字节。 EOF无法代表char;仅作为int

在您的情况下,我们知道我们正在使用的文件足够小,以至于将整个文件加载到缓冲区中可能会成功,因此我们可以使用mallocfree代替:

#include <stdio.h>
#include <stdlib.h>


typedef unsigned char byte;

int main(int argc, char *argv[])
{
    FILE *fp = fopen("C:\\Coding\\Bitmap Program\\Sample.bmp", "rb");
    byte *buffer = NULL;
    size_t len;
    int i;

    fseek(fp, 0, SEEK_END);

    len = ftell(fp);
    rewind(fp);

    buffer = malloc(len);
    if(!buffer)
    {
        perror("malloc");
        exit(EXIT_FAILURE);
    }

    fread(buffer, 1, len, fp);
    fclose(fp);
    for(i = 0; i < len; i++)
    {
        if(i%16==0) putchar('\n');
        printf("%.2X ", buffer[i]&0xFF);

    }
    free(buffer);
    return 0;
}