C++ memchr一个bin文件

C++ memchr一个bin文件,c++,c,C++,C,我试图在二进制文件中查找0x0D0A,但当strchr找到0x00时,它会停止,并且我没有得到正确的位置 请告诉我为什么它不起作用 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <windows.h> main(){ FILE *f; long size; char *buffer; f = fopen(filename,

我试图在二进制文件中查找0x0D0A,但当strchr找到0x00时,它会停止,并且我没有得到正确的位置

请告诉我为什么它不起作用

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <windows.h>

main(){
    FILE *f;
    long size;
    char *buffer;

    f = fopen(filename, "rb");
    if(f==NULL){fputs("File error",stderr); exit(1);}

    // obtain file size
    fseek(f, 0, SEEK_END);
    size = ftell(f);
    rewind(f);

    // allocate memory to contain the whole file
    buffer = (char*) malloc(sizeof(char)*size);
    if(buffer == NULL){fputs("Memory error",stderr); exit(2);}

    // copy the file into the buffer
    if((size_t)fread(buffer,1,size,f) != size){fputs("Reading error",stderr); exit(3);}
    fclose(f);

    // get positions
    char *p;
    p = strchr(buffer, 0x0D0A);
    while(p != NULL){
        printf("found at %d\n", p-buffer-1);
        p = strchr(p+2, 0x0D0A);
    }

    free(buffer);
    return 0;
}

您已经解释了一个原因(可能的嵌入式NUL)。另一个原因是您没有在末尾添加NUL字符。第三个原因是您提供的
strchr
不是字符


您可以使用
memchr
执行部分作业(搜索
0x0D
)。如果你走这条路,你必须自己检查
0x0A

你已经解释了一个原因(可能的嵌入式NUL)。另一个原因是您没有在末尾添加NUL字符。第三个原因是您提供的
strchr
不是字符


您可以使用
memchr
执行部分作业(搜索
0x0D
)。如果你走这条路,你必须自己检查
0x0A

你不能对二进制数据使用
str…()
函数,因为它们只用于字符串(以
memcpy()
strcpy()
为例)

您只需执行一个简单的循环:

unsigned int pos = 0;

while(pos + 1 < size) // compare with +1 as we won't check the last char in the buffer
{
    if(buffer[pos] = 0x0d && buffer[pos+1] == 0x0a)
        printf("found at %d\n", pos);
    ++pos;
}
unsigned int pos=0;
while(pos+1

还要记住,根据文件大小,您可能不希望一次将整个文件读入内存。至于其他错误,请参见aix的答案。

您不能对二进制数据使用
str…()
函数,因为它们只用于字符串(以
memcpy()
vs.
strcpy()
为例)

您只需执行一个简单的循环:

unsigned int pos = 0;

while(pos + 1 < size) // compare with +1 as we won't check the last char in the buffer
{
    if(buffer[pos] = 0x0d && buffer[pos+1] == 0x0a)
        printf("found at %d\n", pos);
    ++pos;
}
unsigned int pos=0;
while(pos+1

还要记住,根据文件大小,您可能不希望一次将整个文件读入内存。至于其他错误,请参阅aix的答案。

使用memchr查找'\r',然后测试'\n'是否是下一个字符。

使用memchr查找'\r',然后测试“\n”是否为下一个字符。

memchar返回一个地址,由于您找到了0x0D的第一个地址并将其存储在p中,因此无法在同一地址找到0x0A或甚至另一个0x0D。试着去限制p和memchar的返回值,看看它们指向的是什么,假设您正在寻找的是字符而不是它们的地址。

memchar返回一个地址,因为您找到了第一个地址0x0D并将其存储在p中,那么您就无法在同一个地址找到0x0A甚至另一个0x0D。尝试使用Derep和memchar的返回值,看看它们指向的是什么,假设您正在查找的是char而不是它们的地址。

您知道原因,并询问它为什么不起作用?我认为他在寻求补救方法,您可以在您的文件中使用
mmap
,然后使用@Mario的解决方案。对于您的更新:不要使用memchr检查1个特定字符,请执行“if(p[1]==0x0A){/*found*/}”就像Patriice和aix的答案一样,或者使用Mario的答案,这个答案非常简单,可以检查两个字符。你知道原因,然后问为什么它不起作用?我想他是在寻求补救办法,你可以在你的文件上使用
mmap
,然后使用@Mario的解决方案。对于您的更新:不要使用memchr来检查1个特定字符,请按照Patriice和aix的答案中的“if(p[1]==0x0A){/*found*/}”或使用Mario的答案,该答案非常简单,可以检查2个字符Mchr解决了第一部分,但是在一个包含4个0x0D0A的bin文件中,它返回8个位置。我认为它只是查找0x0A,而不是0x0D0A。我将搜索您要求它搜索的字符,不多也不少。它不能一次搜索两个字符,正如我答案的最后一句所解释的。memchr解决了第一部分,但在一个包含4 0x0D0A的bin文件中,它返回8个位置。我认为它只搜索0x0A,而不是0x0D0A。我将搜索您要求它搜索的字符,不多也不少。它不能同时搜索两个字符,正如我答案的最后一句所解释的。