簡體   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