打开一个png文件并在C中读取它的十六进制值

She*_*key 1 c png hex

我试图读取任何文件类型结尾的文件,并确定它是否为十六进制值,如果它是一个PNG文件.

到目前为止,我已尝试过两条不同的路径,但没有一条路在工作

  • 首先我读取前16个字符,因为前8个十六进制值确定它是否有正确的标题.然后我尝试将其分离并读取为十六进制值,因为它在此处的其他一些线程中呈现.
  • 另一个我只想读取前两个值,并确定它是否是十六进制值,甚至看它是否正常工作.它不是.

码:

int IS_PNG_FILE(char *name)
{
    FILE *dat = fopen (name, "rt");
    if (dat == NULL) return 1;
    int data_point;

    char buf[16], a[16];
    fgets(buf, 16, dat);
    printf("%s\n", buf);
    int i, b;
    for (i=0; i<16; i++)
    {
        sscanf(&buf[i], "%2x", &b);
        a[i] = b;
        i += 2;
    }
    printf("%d\n", a);


    fscanf(dat, "%2x", &data_point);
    printf("%d\n", data_point);

    fclose(dat);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

eya*_*alm 5

为了从文件中读取二进制字节,请使用fread:

函数fread()从流指向的流中读取数据的nmemb元素,每个数据字节长,将它们存储在ptr给定的位置.

就像是:

unsigned char head[8];

fread(head, sizeof(head), 1, dat);
Run Code Online (Sandbox Code Playgroud)

您可以检查返回值以验证实际读取了8个字节.

然后使用memcmp进行比较

unsigned char signature[8] = {0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A};

if (!memcmp(signature, head, 8))
{
    ...
}
Run Code Online (Sandbox Code Playgroud)