2011-12-23 3 views
1

バイナリファイルで0x0D0Aを検索しようとしていますが、0x00が見つかるとstrchrが停止し、正しい位置を取得しません。memchr a binファイル

それは

#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; 
} 

アップデートを働いていない理由を

if(((char*) memchr(p+1, 0x0A, size))-1 == p)が(すでに一つの理由を説明しましたが、可能になりました

int *pos,i=0; 
char *p; 
p = (char*) memchr(buffer, 0x0D, size); 
while(p != NULL){ 
    if(((char*) memchr(p+1, 0x0A, size))-1 == p){ 
     pos[i++] = p-buffer-1; 
     printf("found at %d\n", pos[i-1]);// check 
    } 
    p = (char*) memchr(p+2, 0x0D, size); 
} 
+0

あなたはその理由を知っています。なぜそれが機能しないのか尋ねますか? –

+0

私は彼がそれに対処することを求めていると思います – akappa

+0

あなたのファイルで 'mmap'を使って、@Marioの解決法を使うことができます。 – hochl

答えて

4

バイナリデータには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; 
} 

またファイルのサイズに応じて、一度にメモリにファイル全体を読んでいないしたい場合がありますことを心に留めておいてください。他の間違いについては、aixの答えを参照してください。

3

まあ動作しません教えてください埋め込まれたNUL)。別の理由は、最後にNUL文字を追加していないということです。第3の理由は、に与えている0x0D0Aは文字ではないということです。

memchrを使用して、ジョブの部分0x0Dを検索)を実行できます。このルートを降りる場合は、0x0Aを確認する必要があります。

+0

memchrは最初の部分を解決しましたが、4 0x0D0Aのビンファイルでは8個の位置を返します –

+0

0x0A0を探すのではなく0x0Aを探します –

+0

あなたが求める文字を検索しますそれまで、それ以上はない。私の答えの最後の文で説明されているように、一度に2つの文字を検索することはできません。 – NPE

7

'\ r'を見つけるためにmemchrを使い、 '\ n'が次の文字であるかどうかをテストします。

+1

+1と答えてください。 – hochl

0

memcharはアドレスを返し、0x0Dの最初のaccourenceのアドレスを見つけてpに格納するので、同じアドレスで0x0Aまたは0x0Dを見つけることはできません。 pと、それらのアドレスではなくcharを探していると仮定して、何を指しているのかを調べるために、pとmemcharの戻り値を逆にしてみてください。

関連する問題