C语言 我的代码打印了一个对图像无效的十六进制,它不是我正在比较的数组中的值,我不明白你从何而来

ljsrvy3e  于 2023-08-03  发布在  其他
关注(0)|答案(3)|浏览(64)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() 
{
    // open image
    FILE *image = fopen("me.jpg", "r");
    // read image
    // check if file is NULL
    if(image == NULL) 
    {
        return 1;
    }
    // store char signature in array
    unsigned char signature[4];
    // store extra
    unsigned char extra[16] = 
    {
      0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
      0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef
    };
    // read signature
    fread(signature, 4, 1, image);
    // read extra
    char extrahex = fread(extra, 16, 1, image);
    // find extra in the image
    for (int i = 0; i < 16; i++) 
    {
        if(extra[i] == extrahex)
        {
            printf("%#04x\n", extrahex);
            return 0;
            char hexnum = extrahex;
            // condition for jpeg
            if(signature[0] == 0xff && signature[1] == 0xd8 && signature[2] == 0xff && signature[3] == hexnum) 
            {
                printf("valid jpeg format\n");
            } 
            else 
            {
                printf("not a valid jpeg format\n");
            }
            return 0;
        }
    }
    fclose(image);
}

字符串
打印的返回值为:0x01,这不是我正在检查图像的额外数组中的值。当然,结果是“不是有效的jpg格式”。我尝试了一个不同的图像,它打印相同的0x01值。


的数据

n3h0vuf2

n3h0vuf21#

您不需要再调用fread。相反,您必须检查signature[3]是否是存储在extra中的已知值之一。

#include <stdio.h>

int main(void)
{
    FILE *image = fopen("me.jpg", "r");

    if (!image)
    {
        return 1;
    }

    unsigned char signature[4];
    unsigned char extra[16] = {
        0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
        0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef
    };

    fread(signature, 4, 1, image);
    fclose(image);

    if (signature[0] == 0xff && signature[1] == 0xd8 && signature[2] == 0xff)
    {
        for (size_t i = 0; i < 16; i++)
        {
            if (signature[3] == extra[i])
            {
                puts("valid jpeg format");
                return 0;
            }
        }
    }

    puts("not a valid jpeg format");
}

字符串
或者,检查signature[3]的前四位是否为11100xe)。

#include <stdio.h>

int main(void)
{
    FILE *image = fopen("me.jpg", "r");

    if (!image)
    {
        return 1;
    }

    unsigned char signature[4];

    fread(signature, 4, 1, image);
    fclose(image);

    if (signature[0] == 0xff &&
        signature[1] == 0xd8 &&
        signature[2] == 0xff &&
        (signature[3] >> 4) == 0xe)
    {
        puts("valid jpeg format");
    }
    else
    {
        puts("not a valid jpeg format");
    }
}

hrysbysz

hrysbysz2#

如本文所述:https://en.cppreference.com/w/c/io/freadfread的返回值是函数读取的完整项目数。在本例中,您尝试读取1个大小为16字节的元素。所以extrahex将永远是0x01。
只是猜测:您可能需要**char extrahex = signature[3]**代替

oprakyz7

oprakyz73#

以Oka为例解决。不过有趣的是,我使用了地址和指针,在printf.

中返回值仍然是1

相关问题