比较C中的数组

时间:2014-10-10 18:35:46

标签: c arrays

想知道是否有一种方法可以同时比较数组中的一组数据。我正在从家庭作业中制作JPEG图像恢复程序,我对JPEG字节模式进行了硬编码,看起来有点乱。

如果我可以收集有关如何整理此代码的建议,那将对我有所帮助。问题从while循环内的if条件开始。

我要检查的字节模式是0xff 0xd8 0xff 0xe0或0xff 0xd8 0xff 0xe1

#define BLOCKSIZE 512

typedef uint8_t BYTE;

int main(int argc, char* argv[])
{
    // create a buffer of 512 Bytes
    BYTE buffer[BLOCKSIZE];

    // open card, check if fopen is successful 
    FILE* card = fopen("card.raw", "r");
    if (card == NULL)
    {
        printf("Failed to open card.\n");
        return -1;
    }

    // scan through card, 1 block at a time (512 Bytes) until end of file
    while (fread(&buffer, BLOCKSIZE, 1, card) == 1)
    {
        // read current buffer
        fread(&buffer, BLOCKSIZE, 1, card);

        // check if current buffer marks the start of a JPEG pattern
        if ((buffer[0] == 0xff && buffer[1] == 0xd8 && buffer[2] == 0xff && buffer[3] == 0xe0) ||
            (buffer[0] == 0xff && buffer[1] == 0xd8 && buffer[2] == 0xff && buffer[3] == 0xe1))

    }
}

2 个答案:

答案 0 :(得分:1)

您可以稍微简化一下:

if (buffer[0] == 0xff && buffer[1] == 0xd8 && buffer[2] == 0xff && ((buffer[3]&0xfe) == 0xe0))

也就是说,结合常用部分,并使用掩码隐藏您在检查buffer[3]时不关心的位。

您还可以使用memcmp来比较2个不同的内存块(在您的情况下,一个是您要测试的运行)。

答案 1 :(得分:1)

这里需要使用字节数组吗?由于您要检查4个字节,因此可以使用uint32_t buffer[BLOCKSIZE / 4]

从那里,您需要确保fread()正在逐字阅读。

fread(&buffer, sizeof(uint32_t), 1, card); // untested code

然后检查:if buffer[0] == 0xffd8ffe0 || **I'll leave this as an exercise to the reader**

此外,两次调用fread()可能没有您期望的行为。