C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[32]: バイナリコード内の16進数での文字列検索


(過去ログ 52 を表示中)

[トピック内 72 記事 (1 - 20 表示)]  << 0 | 1 | 2 | 3 >>

■28511 / inTopicNo.1)  バイナリコード内の16進数での文字列検索
  
□投稿者/ しょう (1回)-(2008/11/27(Thu) 11:25:33)

分類:[C/C++] 

ご教授宜しくお願いします。

C++2003を使ってバイナリファイルを扱うツールを作っています。
今回問題となっている仕様としては、「fopenを使ってバイナリモードで取得したバイナリデータに特定の文字列が存在するか」という部分があります。
ここで言っている「特定の文字列」は16進数です。
この仕様をどうソースに書いていいかわからなく困っています。
検索の仕方が悪いのか丸2日間かかっても調べられませんでした。

どなたかいい方法をご存知でしたら教えてください。

説明不足かもしれませんが宜しくお願いします。

引用返信 編集キー/
■28512 / inTopicNo.2)  Re[1]: バイナリコード内の16進数での文字列検索
□投稿者/ ま (168回)-(2008/11/27(Thu) 11:30:26)
先頭の1文字を検索して見つかったら、検索文字列の長さ分比較すれば
いいですよ。


引用返信 編集キー/
■28513 / inTopicNo.3)  Re[2]: バイナリコード内の16進数での文字列検索
□投稿者/ しょう (2回)-(2008/11/27(Thu) 11:33:47)
No28512 (ま さん) に返信

お返事有難うございます。

> 先頭の1文字を検索して見つかったら、検索文字列の長さ分比較すれば
> いいですよ。

fopenで取得した内容が既に16進数ということでしょうか?
引用返信 編集キー/
■28514 / inTopicNo.4)  Re[1]: バイナリコード内の16進数での文字列検索
□投稿者/ .SHO (196回)-(2008/11/27(Thu) 11:33:51)
とりあえず、fopen でファイルをコピーするプログラムを書いてみてはどうでしょう?

引用返信 編集キー/
■28515 / inTopicNo.5)  Re[3]: バイナリコード内の16進数での文字列検索
□投稿者/ .SHO (197回)-(2008/11/27(Thu) 11:36:29)
No28513 (しょう さん) に返信

> fopenで取得した内容が既に16進数ということでしょうか?

16進数というとこでハマってるんですね。
「特定の文字列」というのは、どのように変数に格納されているのですか?
引用返信 編集キー/
■28516 / inTopicNo.6)  Re[4]: バイナリコード内の16進数での文字列検索
□投稿者/ しょう (3回)-(2008/11/27(Thu) 11:52:49)
No28515 (.SHO さん) に返信

お返事有難うございます。

> > 16進数というとこでハマってるんですね。
はい、もしかしたらそのせいで複雑に考えすぎているのでは?とも思っています。

> 「特定の文字列」というのは、どのように変数に格納されているのですか?

char *hoge = 0x00;
みたいな感じです。
例えばfopenで取得した内容を表示しようとするとそのままではどうしても文字化けというか、おかしくなります。
だからそのまま文字列で検索しても駄目なのかと思っているのですが…
引用返信 編集キー/
■28517 / inTopicNo.7)  Re[5]: バイナリコード内の16進数での文字列検索
□投稿者/ .SHO (198回)-(2008/11/27(Thu) 11:56:32)
No28516 (しょう さん) に返信

> char *hoge = 0x00;

これは 0x00 だから、たまたま上手くいきますが
文法的に間違ってますよ。

引用返信 編集キー/
■28518 / inTopicNo.8)  Re[3]: バイナリコード内の16進数での文字列検索
□投稿者/ Jitta (542回)-(2008/11/27(Thu) 12:04:52)
No28513 (しょう さん) に返信
> ■No28512 (ま さん) に返信
>
> お返事有難うございます。
>
>>先頭の1文字を検索して見つかったら、検索文字列の長さ分比較すれば
>>いいですよ。
>
> fopenで取得した内容が既に16進数ということでしょうか?

文字列なんてものはない。全て数値です。その数値に、人間が見て意味のある形を割り当てたところが「文字」。その文字が複数連続して現れるのが「文字列」。

char の定義を見てください。0〜255(-128〜127)という数値でしょ?
このうち、0x20(32)〜0x7f(127) までが文字に割り当てられています(ASCII コードの場合)。C 言語の場合、この範囲の数値が複数個、0x00 が出てくるまで並んでいたら文字列です。他の言語では、文字数を表す数値と、実際の文字で文字列を表すものもあります。
引用返信 編集キー/
■28521 / inTopicNo.9)  Re[6]: バイナリコード内の16進数での文字列検索
□投稿者/ しょう (4回)-(2008/11/27(Thu) 13:13:00)
No28517 (.SHO さん) に返信

お返事有難うございます。

> 文法的に間違ってますよ。

すいません…
実はC++も初心者でして…
ポインタにしてる事が間違っているということでしょうか?

引用返信 編集キー/
■28522 / inTopicNo.10)  Re[4]: バイナリコード内の16進数での文字列検索
□投稿者/ しょう (5回)-(2008/11/27(Thu) 13:16:42)
No28518 (Jitta さん) に返信

お返事有難うございます。
> > 文字列なんてものはない。全て数値です。その数値に、人間が見て意味のある形を割り当てたところが「文字」。その文字が複数連続して現れるのが「文字列」。
> > char の定義を見てください。0〜255(-128〜127)という数値でしょ?
> このうち、0x20(32)〜0x7f(127) までが文字に割り当てられています(ASCII コードの場合)。C 言語の場合、この範囲の数値が複数個、0x00 が出てくるまで並んでいたら文字列です。他の言語では、文字数を表す数値と、実際の文字で文字列を表すものもあります。

なるほど。
今試してる方法は

FILE *fp;
char buf[BUFSIZ];

fp = fopen("A.hoge","rb");

while(fgets(buf,BUFSIZ,fp){
cout << buf << endl;
}

といった感じで流れを調べているのですが、そもそもcoutじゃ文字列扱いだから駄目ということでしょうか?
引用返信 編集キー/
■28523 / inTopicNo.11)  Re[5]: バイナリコード内の16進数での文字列検索
□投稿者/ しょう (6回)-(2008/11/27(Thu) 13:17:59)
すいません、上記間違いです。

while(fgets(buf,BUFSIZ,fp){
cout << buf << endl;
}

ではなく

while(fgets(buf,BUFSIZ,fp) != NULL){
cout << buf << endl;
}
でした。
引用返信 編集キー/
■28526 / inTopicNo.12)  Re[7]: バイナリコード内の16進数での文字列検索
□投稿者/ .SHO (199回)-(2008/11/27(Thu) 13:29:46)
No28521 (しょう さん) に返信

> すいません…
> 実はC++も初心者でして…
> ポインタにしてる事が間違っているということでしょうか?

0x00 を 0x01 にしてコンパイルしてみてください。
引用返信 編集キー/
■28527 / inTopicNo.13)  Re[5]: バイナリコード内の16進数での文字列検索
□投稿者/ .SHO (200回)-(2008/11/27(Thu) 13:32:51)
No28522 (しょう さん) に返信

> そもそもcoutじゃ文字列扱いだから駄目ということでしょうか?

そうです。
"A.hoge" を、テキストファイルにして試してみてください。
引用返信 編集キー/
■28528 / inTopicNo.14)  Re[6]: バイナリコード内の16進数での文字列検索
□投稿者/ アキラ (126回)-(2008/11/27(Thu) 13:43:55)
アキラ さんの Web サイト
No28517 (.SHO さん) に返信
> ■No28516 (しょう さん) に返信
>
>>char *hoge = 0x00;
>
> これは 0x00 だから、たまたま上手くいきますが
> 文法的に間違ってますよ。

文法的には間違ってないですよ。
ポインタをヌルポインタで初期化してるのだから、何も間違ってないです。
引用返信 編集キー/
■28529 / inTopicNo.15)  Re[8]: バイナリコード内の16進数での文字列検索
□投稿者/ しょう (7回)-(2008/11/27(Thu) 13:50:42)
No28526 (.SHO さん) に返信

お返事ありがとうございます。
> > 0x00 を 0x01 にしてコンパイルしてみてください。

エラーですね…
後続処理の変換系エラーがでます。
ポインタがまだよくわかってなくてすみません…

引用返信 編集キー/
■28530 / inTopicNo.16)  Re[6]: バイナリコード内の16進数での文字列検索
□投稿者/ しょう (8回)-(2008/11/27(Thu) 13:52:21)
No28527 (.SHO さん) に返信

> "A.hoge" を、テキストファイルにして試してみてください。

正常にcoutで出力できました。
内容は「あいうえお\nかきくけこ\n」です。
引用返信 編集キー/
■28531 / inTopicNo.17)  Re[7]: バイナリコード内の16進数での文字列検索
□投稿者/ .SHO (201回)-(2008/11/27(Thu) 13:54:24)
No28528 (アキラ さん) に返信

> 文法的には間違ってないですよ。
> ポインタをヌルポインタで初期化してるのだから、何も間違ってないです。

もちろんわかってますよ。
もともとの意図は「特定の文字列」を16進数で定義しようとしたのであって
その16進数が、たまたま0x00だったので、意味的にはヌルポインターでの
初期化になっただけで、それが0x00以外の16進数だったら間違っているという意味です。
引用返信 編集キー/
■28532 / inTopicNo.18)  Re[9]: バイナリコード内の16進数での文字列検索
□投稿者/ .SHO (202回)-(2008/11/27(Thu) 14:02:50)
No28529 (しょう さん) に返信

> エラーですね…
> 後続処理の変換系エラーがでます。
> ポインタがまだよくわかってなくてすみません…

ですね。
16進数を文字列の中に定義するなら
char *hoge = "\x00";
です。

ところで「特定の文字列」というのは1バイトなんですか?
引用返信 編集キー/
■28533 / inTopicNo.19)  Re[7]: バイナリコード内の16進数での文字列検索
□投稿者/ .SHO (203回)-(2008/11/27(Thu) 14:05:48)
No28530 (しょう さん) に返信

> 正常にcoutで出力できました。
> 内容は「あいうえお\nかきくけこ\n」です。

ですよね。
つまり、処理としては間違ってないんです。
バイナリファイルをcoutしても、まともに読めるように表示されなくて当然ですよね。

ってなると、わかんなくなちゃいます?
引用返信 編集キー/
■28534 / inTopicNo.20)  Re[7]: バイナリコード内の16進数での文字列検索
 
□投稿者/ しょう (9回)-(2008/11/27(Thu) 14:14:06)
すいません、自分の質問内容を読んでイマイチな気がしたので簡単にまとめさせてください。

・A.hogeというバイナリファイルがある。
・このファイルにはどこかに日付があり、この日付を書き換える機能を作る。
・該当個所をstirlingというツールで確認した所、下記のようである。

[16進数]         [文字列]
 32 30 30 38 2F 34 2F 31  2008/4/1

・この内容を例えば"2008/12/13"にしたい場合、

[16進数]           [文字列]
 32 30 30 38 2F 31 32 2F 31 33  2008/12/13

 という形になる。つまり長さの変動がある。→後ろのアドレスが全部変わる。

・16進数のアドレスは後続処理で参照する為、文字列を直接編集するより16進数を書き換えた方がいいと判断。

よって、「16進数で検索・変更を行う必要がある」というのが今回の機能です。

次に現状ですが、
■C++初心者の為、ポインタ・文字列の扱いに慣れていない。
■バイナリファイルを扱うのは初めて。
という難題があるわけで…

私の頓珍漢なやり方にストレスを感じる方もいらっしゃいますでしょうが、ご理解いただけると助かります。

引用返信 編集キー/

次の20件>
トピック内ページ移動 / << 0 | 1 | 2 | 3 >>

管理者用

- Child Tree -