【发布时间】:2011-08-30 16:40:13
【问题描述】:
我已使用 fread 将文件读入字符数组。现在我想在该数组中搜索两个连续的十六进制值,即 FF 后跟 D9(它是一个表示文件结尾的 jpeg 标记)。这是我用来执行此操作的代码:
char* searchBuffer(char* b) {
char* p1 = b;
char* p2 = ++b;
int count = 0;
while (*p1 != (unsigned char)0xFF && *p2 != (unsigned char)0xD9) {
p1++;
p2++;
count++;
}
count = count;
return p1;
}
现在我知道,如果我搜索不包含 0xFF 的十六进制值(例如 4E 后跟 46),则此代码有效,但每次我尝试搜索 0xFF 时都会失败。当我不将十六进制值转换为 unsigned char 时,程序不会进入 while 循环,当我这样做时,程序会遍历数组中的所有字符并且不会停止,直到出现越界错误。我被难住了,请帮忙。
忽略计数,它只是一个帮助我调试的变量。
提前致谢。
【问题讨论】:
-
我实际上不相信你的条件是正确的。不应该是
!(*p1 == (unsigned char)0xFF && *p2 == (unsigned char)0xD9)吗? (暂且不说你对unsigned char和unsigned int的问题)正如目前所写的那样,你的循环似乎会在遇到0xFF 或 0xD9 时结束。 -
你为什么不用
strstr()? -
将
&&更改为||并阅读 Oli 的答案。 -
@Angel:因为 JPEG 文件不是 C 字符串。
-
另请注意,您的代码存在处理格式错误数据的主要设计错误。它不将缓冲区的长度作为参数,因此如果未找到终止字节,它将愉快地运行超过缓冲区的末尾,从而导致 UB。您可以通过传递和测试长度来解决此问题,或者在从文件中读取缓冲区后始终将终止字节附加到缓冲区。
标签: c arrays search pointers hex