C 无法点击0xff

C 无法点击0xff,c,jpeg,C,Jpeg,我有一个小挑战(可以在页面底部找到,标题是CSI.,太长了,我无法粘贴。) () 这项工作主要是在.raw文件(上传的文件)中嗅出JPG文件 我使用的代码如下所示: #include <stdio.h> int main(void){ FILE* fp = fopen("card.raw", "r"); if (fp == NULL){ printf("error!"); } char foo[512]; fread(fo

我有一个小挑战(可以在页面底部找到,标题是CSI.,太长了,我无法粘贴。) ()

这项工作主要是在.raw文件(上传的文件)中嗅出JPG文件

我使用的代码如下所示:

 #include <stdio.h>

 int main(void){
    FILE* fp = fopen("card.raw", "r");
    if (fp == NULL){
        printf("error!");
    }
    char foo[512];
    fread(foo,sizeof(foo),sizeof(foo[0]), fp);
    for(int j = 0; j < 20000; j++) {
        if (foo[0] == 0xff){
            printf("jackpot");
            return 0;
        }
        else {
            printf(" %d ", foo[0]);
            fread(foo,sizeof(foo),sizeof(foo[0]), fp);
        }
    }
}
#包括
内部主(空){
FILE*fp=fopen(“card.raw”,“r”);
如果(fp==NULL){
printf(“错误!”);
}
char-foo[512];
fread(foo,sizeof(foo),sizeof(foo[0]),fp);
对于(int j=0;j<20000;j++){
if(foo[0]==0xff){
printf(“头奖”);
返回0;
}
否则{
printf(“%d”,foo[0]);
fread(foo,sizeof(foo),sizeof(foo[0]),fp);
}
}
}
问题是,我不知道我到底做错了什么。它应该尖叫出来,并在碰到0xff时立即退出,但它一直在继续。。 文件可在以下位置找到: 如果需要的话

更新: 谢谢大家的帮助,我终于中了头奖。这是我最后的代码

#include <stdio.h>
#include <stdint.h>

typedef uint8_t BYTE;
int main(void){
    FILE* fp = fopen("card.raw", "rb");
    if (fp == NULL){
        printf("error!");
    }
    BYTE foo[512];    
    for (int j = 0;fread(foo,sizeof(foo),sizeof(foo[0]), fp) > 0; j++){
        if (foo[0] == 0xff){
            printf("jackpot, %d", j);
            return 0;
        }
    }
}
#包括
#包括
typedef uint8_t字节;
内部主(空){
FILE*fp=fopen(“card.raw”、“rb”);
如果(fp==NULL){
printf(“错误!”);
}
字节foo[512];
对于(intj=0;fread(foo,sizeof(foo),sizeof(foo[0]),fp)>0;j++){
if(foo[0]==0xff){
printf(“头奖,%d”,j);
返回0;
}
}
}

我看到您有两个问题

一个是,除了读取的块的第一个字节外,您实际上不检查任何内容。第二,您可以继续阅读,而不考虑文件结尾或错误

您应该重新设计以在循环中读取(同时检查错误和文件结尾),并在该循环中使用另一个循环来查找您要查找的字节序列


大概是这样的:

for (;;)
{
    size_t nread = fread(...);
    if (nread == 0)
    {
        /* Error or end-of-file */
        break;
    }

    for (int i = 0; i < nread; i++)
    {
        /* Check for signature in `foo[i]` */
    }
}

我猜您正在以
“r”
模式读取该文件,这可能会转换换行符并扰乱块同步


尝试在
“rb”
模式(二进制模式)下读取文件。

谢谢,我不知道为什么,只是切换到了那个让我中大奖的模式!
while (fread(...) > 0)
{
    /* Check for signature in `foo[0]` */
}