繁体   English   中英

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

[英]Trying to read bitmap file as hexadecimals

#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

长篇文章,对不起。 任何帮助是极大的赞赏。

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

更改此:

char ch;

至:

int ch;

%02X这样的printf的格式说明符之前的%02X只能保证输出的字符数最少 ,而不能保证最大字符数。 fgetc返回一个int ,而不是一个char 如果int为负2的补码,则表示int的整个位串将被打印,包括开头的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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM