无法命中0xff

时间:2013-04-09 08:48:29

标签: c jpeg

我有一个小挑战(可以在页面底部找到,标题是CSI。https://x.cs50.net/2012/psets/4/pset4.html,我太长了以至于无法粘贴。) (And no, i am not trying to cheat, i already found a full code solution but i want mine to work..

这项工作几乎是在.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);
        }
    }
}

问题是,我不知道我做错了什么。它应该在它碰到0xff时尖叫并退出但是它继续前进和前进...... 文件位于https://mega.co.nz/#!tZcFWYIS!DmPAGT7FHLFgtW0SorWU-SE-gfJfR7MlbxdNucN1Biw  如果需要的话。

更新: 感谢大家的帮助,我终于获得了大奖。这是我最终的最终代码。

#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;
        }
    }
}

2 个答案:

答案 0 :(得分:3)

我的猜测是你正在以"r"模式读取文件,这可能会转换换行符并搞乱块同步。

尝试以"rb"模式(二进制模式)读取文件。

答案 1 :(得分:2)

我看到了两个问题。

一个是你没有真正检查过你读过的块的第一个字节。第二个是你继续阅读而不考虑文件结束或错误。

你应该重新设计读取循环(同时检查错误和文件结束),并在该循环中有另一个循环来查找你正在寻找的字节序列。


这样的事情:

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]` */
    }
}

如果只在每个512字节块的开头找到签名,则不需要第二个内部循环,并且可以大大简化它:

while (fread(...) > 0)
{
    /* Check for signature in `foo[0]` */
}