【发布时间】:2022-01-02 01:51:50
【问题描述】:
我有一个文件,我试图在其中查找以下字节序列:0xFF、0xD8、0xFF 和 0xE0。现在,假设我只在寻找 0xFF。我制作了这个程序进行测试:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void analyzeFile(char* filename)
{
FILE* filePtr = fopen(filename, "rb");
int numImages = 0;
while (!feof(filePtr))
{
char bytes;
bytes = getc(filePtr);
printf("%c", bytes);
if ((bytes == 0xFF))
{
numImages++;
printf("image found!\n");
}
}
printf("%d\n", numImages);
}
这行不通。当我用参数“test.txt”调用analyzeFile时,它可以很好地打印文件的内容,但没有检测到单个0xFF字节:
test.txt 的内容:
aÿØÿÿà1234
输出:
aÿØÿÿà1234
0
作为参考,0xFF 相当于 y-diaeresis,ÿ,根据 ASCII。
【问题讨论】:
-
0xFF不是由 ASCII 定义的。使用hexdump或其他一些十六进制查看器以数字形式查看实际字节 -
还将您的类型更改为 unsigned char,否则您的比较将不起作用(请参阅这个有趣的实验:ideone.com/Pk0rGg)。这是因为在比较和整数提升期间,带符号的
char值将“符号扩展”到0xFFFFFFFF并与0x000000FF进行比较 -
while (!feof(filePtr))是一个错误。feof返回早期读取是否找到 EOF。只需调用getc并检查它是否返回EOF。 -
@humanbean 很可能它正在检测
EOF。按照上面的建议更改为int。并摆脱while (!feof(filePtr))- 请参阅Why is “while ( !feof (file) )” always wrong? -
@humanbean 表示你的文件不包含 0xFF 字节。