【问题标题】:Comparing Arrays in C比较 C 中的数组
【发布时间】:2025-12-10 12:30:01
【问题描述】:

想知道是否有一种方法可以一次比较数组中的一组数据。我目前正在从作业中制作一个 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))

    }
}

【问题讨论】:

  • 把它放在一个函数中。将其命名为描述性的名称。

标签: c arrays


【解决方案1】:

你可以稍微简化一下:

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

即把常用的部分组合起来,用掩码把你检查buffer[3]时不关心的位隐藏起来。

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

【讨论】:

  • 为什么不读取uint32_t,屏蔽位,与32位常量比较?
  • 有道理!感谢您的建议!我也会研究 memcmp!
  • @dom0: 你有多确定buffer 是对齐的?
  • @dom0: 和字节序问题。
  • 有人可以进一步解释这部分吗?我很新,我对这段代码很困惑。 . . '(缓冲区[3]&0xfe) == 0xe0)'
【解决方案2】:

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

从那里,您需要确保 fread() 正在读取 int-wise。

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

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

另外,两次调用fread() 可能不会出现您所期望的行为。

【讨论】:

  • 根据规范,我们需要一次扫描 512 个字节,因为 CF 卡将其用作块,并且一个接一个地存储。四字节检查是我知道它是否是JPEG开始的方式。谢谢你指出我给 fread 打了两次电话。我对 FILE I/O 还很陌生,还在学习。我读到使用 while feof(*fp) 是一个坏主意,因为它会在知道它是文件的结尾之后再循环一次。我可以得到一些关于我应该做什么的建议吗?
  • 由于我将 BLOCKSIZE 除以 4,因此您只扫描了 512 字节的数据。我的解决方案还检查 4 个字节,只是以一种不那么冗长的方式。 sizeof(4 字节) = sizeof(32 位整数)。