←検索窓の楽しみ方
  ショッピングモール  掲示板ランキング


掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板1

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.4713

バイナリデータの文字列検索
投稿者---maki(2005/10/07 20:02:48)


いつも参考にさせていただいています。maki といいます。
バイナリデータのうち、特定の文字列を検索するよい方法をご存知でしたら教えてください。

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

int main( int argc , char **argv ) {
    unsigned char   string[7];

    string[0] = 0x41;
    string[1] = 0x00;
    string[2] = 0x41;
    string[3] = 0x42;
    string[4] = 0x43;
    string[5] = 0x0a;
    string[6] = 0x00;

// if( ( ptr = strstr(string, "ABC" ) ) == NULL ) return -1;
    printf( "文字列 = %s?n", string );

    return 1;
}


上記ソースのうち、コメントアウトしてあるようなことをやりたいのですが、良い方法はないでしょうか?


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:バイナリデータの文字列検索 4714 まきじ 2005/10/07 20:20:32
<子記事> Re:バイナリデータの文字列検索 4722 nop 2005/10/09 00:25:25


No.4714

Re:バイナリデータの文字列検索
投稿者---まきじ(2005/10/07 20:20:32)


>上記ソースのうち、コメントアウトしてあるようなことをやりたいのですが、良い方法はないでしょうか?
ABCDEDEFGHIJKLMN
- A != D
DEF
-

ABCDEDEFGHIJKLMN
 - B != D
 DEF
 -

ABCDEDEFGHIJKLMN
  - C != D
  DEF
  -

ABCDEDEFGHIJKLMN
   - D == D
   DEF
   -

ABCDEDEFGHIJKLMN
    - E == E
   DEF
    -

ABCDEDEFGHIJKLMN
     - D != F
   DEF
     -

ABCDEDEFGHIJKLMN
    - E != D
    DEF
    -

ABCDEDEFGHIJKLMN
    - E != D
    DEF
    -
ABCDEDEFGHIJKLMN
     - D != D
     DEF
     -

ABCDEDEFGHIJKLMN
      - E == E
     DEF
      -

ABCDEDEFGHIJKLMN
       - F == F
     DEF
       -

ABCDEDEFGHIJKLMN
        - G == 
     DEF
        - \0 になったので一致




この投稿にコメントする

削除パスワード

No.4715

Re:バイナリデータの文字列検索
投稿者---maki(2005/10/07 21:06:23)


お返事ありがとうございます。maki です。

やはり順次1文字ずつ比較していくしかないのですね。他に効率のよい方法か、関数などがあればよいかな?っと思ったのですが。とりあえず、下記方法でトライしてみます。

ありがとうございました。

>>上記ソースのうち、コメントアウトしてあるようなことをやりたいのですが、良い方法はないでしょうか?
>
ABCDEDEFGHIJKLMN
- A != D
DEF
-

ABCDEDEFGHIJKLMN
 - B != D
 DEF
 -

ABCDEDEFGHIJKLMN
  - C != D
  DEF
  -

ABCDEDEFGHIJKLMN
   - D == D
   DEF
   -

ABCDEDEFGHIJKLMN
    - E == E
   DEF
    -

ABCDEDEFGHIJKLMN
     - D != F
   DEF
     -

ABCDEDEFGHIJKLMN
    - E != D
    DEF
    -

ABCDEDEFGHIJKLMN
    - E != D
    DEF
    -
ABCDEDEFGHIJKLMN
     - D != D
     DEF
     -

ABCDEDEFGHIJKLMN
      - E == E
     DEF
      -

ABCDEDEFGHIJKLMN
       - F == F
     DEF
       -

ABCDEDEFGHIJKLMN
        - G == 
     DEF
        - ?0 になったので一致



この投稿にコメントする

削除パスワード

No.4716

Re:バイナリデータの文字列検索
投稿者---まきじ(2005/10/07 21:11:32)


>関数などがあればよいかな?

関数なら strstr()。
strstr() を自作したいという意味かと思ったのですが?

>他に効率のよい方法

BM法というアルゴリズムがあります。
興味があれば調べてください。
# 一文字ずつの検索が作れないとBM法は難しいと思われます。


この投稿にコメントする

削除パスワード

No.4717

Re:バイナリデータの文字列検索
投稿者---あかま(2005/10/07 21:18:26)


バイナリデータの中に'\0'がいっぱいあってstrstrだと最後まで検索してくれないってことでしょうか?
けっこうテキトウですが、こんな感じでどうでしょう。

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

char *binary_str(const char *binary,int binary_size,const char *search){//binaryとsearchの最後は\0で終わってないとダメ。
    int i;
    char *c=0;
    
    for(i=0;i < binary_size;i++){
        if(search[0] == binary[i]){//毎回strstr呼び出すのもなんなので先頭1文字が同じなら
            c = strstr(binary+i,search);
            if(c != NULL) break;
        }
    }
    return c;
}
int main(){
    char *binary="ab\0abb\0eabcdef\0aaa";//バイナリデータ
    int size = 15;//バイナリのサイズ。どっかから持ってくる
    char *serch="abc";//探索する文字列
    
    printf("%s\n",binary_str(binary,size,serch));
    return 0;
}


//binaryやsearchが\0で終わらない時は双方のサイズをbinary_strに渡すように変更
//そのサイズを使って、終端が\0でなくても動くようにstrstrもどきを自作する。




この投稿にコメントする

削除パスワード

No.4718

Re:バイナリデータの文字列検索
投稿者---maki(2005/10/07 21:37:04)


こんばんわ。maki です。
お返事ありがとうございます。

><pre>バイナリデータの中に'?0'がいっぱいあってstrstrだと最後まで検索してくれないってことでしょうか?けっこうテキトウですが、こんな感じでどうでしょう。

そうです。そうです。文字列中に?0 が入っていてstrstr では検索できないのでバイナリ専用の検索関数、もしくはアルゴリズムがあるのか?と思い質問させてもらいました。

私も結局下記のようなソースをくんでいました。ご教授ありがとうございます。

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

char *binary_str(const char *binary,int binary_size,const char *search){//binaryとsearchの最後は?0で終わってないとダメ。
int i;
char *c=0;

for(i=0;i < binary_size;i++){
if(search[0] == binary[i]){//毎回strstr呼び出すのもなんなので先頭1文字が同じなら
c = strstr(binary+i,search);
if(c != NULL) break;
}
}
return c;
}
int main(){
char *binary="ab?0abb?0eabcdef?0aaa";//バイナリデータ
int size = 15;//バイナリのサイズ。どっかから持ってくる
char *serch="abc";//探索する文字列

printf("%s?n",binary_str(binary,size,serch));
return 0;
}


//binaryやsearchが?0で終わらない時は双方のサイズをbinary_strに渡すように変更
//そのサイズを使って、終端が?0でなくても動くようにstrstrもどきを自作する。

</pre>


この投稿にコメントする

削除パスワード

No.4719

Re:バイナリデータの文字列検索
投稿者---まきじ(2005/10/07 22:12:31)


>そうです。そうです。文字列中に?0 が入っていてstrstr では検索できないのでバイナリ専用の検索関数
>終端が?0でなくても動くようにstrstrもどきを自作する。

searchstring() に strstr() と同じ機能を持たせれば完成。

但し、pattern は途中に \0 を含まない。
text の最後には "" によって格納される \0 とは
別に \0 を格納しとく。
found は見つかった個数。

int main(void){

    char buf[]="ABCDEF\0DEFGH\0IJDEKDEF\0";
    char pattern[]="DEF";
    char *text = buf;
    int len = strlen(text) + 1;
    int found = 0;
    
    while(*text){
        searchstring(text,pattern,&found);
        text = &buf[len];
        len = len + strlen(text) + 1;
    }
    
    if(found) printf("mutched %d strings\n",found);
    else puts("Not Found");
    
}



この投稿にコメントする

削除パスワード

No.4730

Re:バイナリデータの文字列検索
投稿者---名前はまだない(2005/10/11 04:35:34)


#include <string.h>
memcmp(string, "ABC", sizeof(string)); // ?
第3引数をいじりながら先に進む手間を考えたら
他の方法と同じかも


この投稿にコメントする

削除パスワード

No.4731

Re:バイナリデータの文字列検索
投稿者---まきじ(2005/10/11 08:34:09)


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

int main(void){

    char text[]="ABCDE\0FGDEFH\0IJDEKDE\0F";
    char pattern[]="DE\0F";
    int tsize = sizeof(text) - 1;
    int psize = sizeof(pattern) - 1;
    int found = 0;
    int i;
    
    for(i = 0;i <= tsize - psize;i++){
        if(!memcmp(&text[i],pattern,psize)) found++;
    }
    
    if(found) printf("matched %d strings\n",found);
    else puts("Not Found");
    
}



この投稿にコメントする

削除パスワード

No.4722

Re:バイナリデータの文字列検索
投稿者---nop(2005/10/09 00:25:25)


>バイナリデータのうち、特定の文字列を検索するよい方法をご存知でしたら教えてください。

検索する文字列がASCIIのみであれば、
バイナリデータ中の'\0'を'\xFF'等に置き換えてから、
strstr()で検索、と言うのはどうだろう?


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧




掲示板提供:Real Integrity