想知道是否有一种方法可以同时比较数组中的一组数据。我正在从家庭作业中制作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))
}
}
答案 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()
可能没有您期望的行为。