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

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

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

Re[1]: テキスト情報を含むバイナリファイルのテキスト部の置換


(過去ログ 112 を表示中)

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

■66398 / inTopicNo.1)  テキスト情報を含むバイナリファイルのテキスト部の置換
  
□投稿者/ マイク (2回)-(2013/04/20(Sat) 11:12:18)

分類:[VB.NET/VB2005 以降] 

こんにちは。
テキストデータを含むバイナリファイルがあるのですが、この中のテキスト部の文字に対して置換を行いたいのですが、
どのような方法があるでしょうか?
なお、以下の前提でOKです。

・テキストデータ部には全角文字は含まれない。また、置換後の文字も全角文字は含まれない。
・バイナリデータ部にはテキスト部の置換するための検索対象の文字の並びと同じデータは含まれない。

VB2010を使っています。よろしくお願いします。
引用返信 編集キー/
■66401 / inTopicNo.2)  Re[1]: テキスト情報を含むバイナリファイルのテキスト部の置換
□投稿者/ Azulean (141回)-(2013/04/20(Sat) 21:33:26)
No66398 (マイク さん) に返信
> テキストデータを含むバイナリファイルがあるのですが、この中のテキスト部の文字に対して置換を行いたいのですが、
> どのような方法があるでしょうか?

普通の読み書き両用で開いて、シークして、書き込む。
ただ、実際のところ、いくつか懸念があります。


(1)書き換え箇所の特定をどうするのか
場所がわからず、バイナリの先頭から複数回出現する可能性を加味していくなら、先頭から文字列検索のようなロジックを自分で書く必要があります。
一定量のバイトデータを読み込み、バイト列検索、一致した場合はファイルポインタを戻してその位置に書き込むという具合です。
そういったロジックは、汎用的ではないので、あなたが FileStream を使って Byte() 配列をうまく解釈する必要があうでしょう。

(2)文字コードは何なのか
文字コードによっては、文字の並びと同じデータは含まれないといっても、エスケープシーケンスがないだけで同じバイト列が発生しうるかもしれません。
また、自分がバイト列を読み込んだとして、かんたんに文字データとして復元可能な文字コードになっているのか、途中から読んでも文字として解釈できるのか、文字コードの特性によって難易度、戦略が変わってくる可能性があります。

(3)置換は同じバイト長・文字長なのか
バイト長が異なるのであれば、短くなるときは前に詰める、詰めた分どこかでパディングする、増えるときは後ろにずらすといったことが必要になる可能性があります。
前述の文字コードにもよりますが、もしかすると、バイト長が同じでも文字長が変わるケースも考慮しないといけないかもしれません。
バイト長が変化することによって、バイナリデータ部のオフセット、相対位置が変わって、データが読めなくなる恐れもあります。

(4)データフォーマットは完全に把握できているか
バイナリエディタをのぞき込んで書き換えればいいやというレベルでは、まずいと思います。
もしかしたら、文字列長や、テキストブロックのチェックサムなどがどこかに存在するかもしれません。
ご自身がきちんとデータフォーマットを理解しているのであれば、そのあたりもケアしてください。
逆に、データフォーマットを知らない場合、データが読めない・壊れるかもしれませんが、大丈夫ですか?
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -