C 无法点击0xff
我有一个小挑战(可以在页面底部找到,标题是CSI.,太长了,我无法粘贴。) () 这项工作主要是在.raw文件(上传的文件)中嗅出JPG文件 我使用的代码如下所示:C 无法点击0xff,c,jpeg,C,Jpeg,我有一个小挑战(可以在页面底部找到,标题是CSI.,太长了,我无法粘贴。) () 这项工作主要是在.raw文件(上传的文件)中嗅出JPG文件 我使用的代码如下所示: #include <stdio.h> int main(void){ FILE* fp = fopen("card.raw", "r"); if (fp == NULL){ printf("error!"); } char foo[512]; fread(fo
#include <stdio.h>
int main(void){
FILE* fp = fopen("card.raw", "r");
if (fp == NULL){
printf("error!");
}
char foo[512];
fread(foo,sizeof(foo),sizeof(foo[0]), fp);
for(int j = 0; j < 20000; j++) {
if (foo[0] == 0xff){
printf("jackpot");
return 0;
}
else {
printf(" %d ", foo[0]);
fread(foo,sizeof(foo),sizeof(foo[0]), fp);
}
}
}
#包括
内部主(空){
FILE*fp=fopen(“card.raw”,“r”);
如果(fp==NULL){
printf(“错误!”);
}
char-foo[512];
fread(foo,sizeof(foo),sizeof(foo[0]),fp);
对于(int j=0;j<20000;j++){
if(foo[0]==0xff){
printf(“头奖”);
返回0;
}
否则{
printf(“%d”,foo[0]);
fread(foo,sizeof(foo),sizeof(foo[0]),fp);
}
}
}
问题是,我不知道我到底做错了什么。它应该尖叫出来,并在碰到0xff时立即退出,但它一直在继续。。
文件可在以下位置找到:
如果需要的话
更新:
谢谢大家的帮助,我终于中了头奖。这是我最后的代码
#include <stdio.h>
#include <stdint.h>
typedef uint8_t BYTE;
int main(void){
FILE* fp = fopen("card.raw", "rb");
if (fp == NULL){
printf("error!");
}
BYTE foo[512];
for (int j = 0;fread(foo,sizeof(foo),sizeof(foo[0]), fp) > 0; j++){
if (foo[0] == 0xff){
printf("jackpot, %d", j);
return 0;
}
}
}
#包括
#包括
typedef uint8_t字节;
内部主(空){
FILE*fp=fopen(“card.raw”、“rb”);
如果(fp==NULL){
printf(“错误!”);
}
字节foo[512];
对于(intj=0;fread(foo,sizeof(foo),sizeof(foo[0]),fp)>0;j++){
if(foo[0]==0xff){
printf(“头奖,%d”,j);
返回0;
}
}
}
我看到您有两个问题
一个是,除了读取的块的第一个字节外,您实际上不检查任何内容。第二,您可以继续阅读,而不考虑文件结尾或错误
您应该重新设计以在循环中读取(同时检查错误和文件结尾),并在该循环中使用另一个循环来查找您要查找的字节序列
大概是这样的:
for (;;)
{
size_t nread = fread(...);
if (nread == 0)
{
/* Error or end-of-file */
break;
}
for (int i = 0; i < nread; i++)
{
/* Check for signature in `foo[i]` */
}
}
我猜您正在以
“r”
模式读取该文件,这可能会转换换行符并扰乱块同步
尝试在
“rb”
模式(二进制模式)下读取文件。谢谢,我不知道为什么,只是切换到了那个让我中大奖的模式!
while (fread(...) > 0)
{
/* Check for signature in `foo[0]` */
}