• ベストアンサー

バイナリデータの書き換え

はじめまして、今回分からない点があり投稿させていただきました。 http://www.vector.co.jp/soft/win95/util/se079072.html 上記ののバイナリエディタの機能の一つにある 『指定した文字列』を『任意の文字列』に置換する方法を教えていただけませんか? 私が出来てる部分は、ファイルを16進数で読み込み置換するまです。 これをファイルとして出力する方法がわかりません。 ご教授お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.4

>最後に質問なんですが、このプログラムは、上、中、下 >で言うとどれくらいのレベルですか? バイナリデータを扱うという点では「中」くらいですね。 ファイル操作については、普通はまずテキストデータを扱うところから始めます。メモ帳等で開いて自分で簡単に中身を確認できますからね。 で、.NETなら本当はここで文字コードについて理解が必要になってきますんで。

tyn
質問者

お礼

ありがとうございました。 文字コードについて学習して、もう少し知識をつけてから挑戦したいと思います。 では失礼します。

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.3

>音声ファイルを16進数でとりこみ、元ファイルの形式に戻すには、どのようにもどしたらよいのですか? 戻すも何も、読み込んだバイト配列の内容を自分で変更して書き込むだけですけど。 >これも文字コードの設定で可能なのでしょうか? というか、文字コードについて勉強しましょうね。 文字コードをちゃんと理解しないでバイナリファイルを文字にして表示なんてのは危険すぎます。 半角英数だけで、Unicode以外の文字コードにするんでしたらSJISもJISもEUCもどれも一緒です。

tyn
質問者

お礼

まだまだ理解できません。 VB始めたばかりというかプログラミングを始めたばかりなのですみません。 もう少し基礎を勉強してから頑張ります。 色々教えて頂きありがとうございます。 最後に質問なんですが、このプログラムは、上、中、下 で言うとどれくらいのレベルですか?

すると、全ての回答が全文表示されます。
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

>こんなソースで書いたのですが、これは全然違いますか? ファイルの入出力は、こんな感じでいいかと思いますけど、読み込んだ内容をどこも置換しないで保存してもしょうがないですよね(^^;;; #あとは、コメントが怪しいですが(^^;; で、メインの置換の部分ですが、 BitConverter.ToString()で文字列にした結果との比較はやめた方がいいかと。ずれる可能性大です。 なので、「指定した文字列」の方もバイト配列に変換してください。 http://dobon.net/vb/dotnet/string/getencoding.html ポイントとして、.NETでは文字列はUnicodeとして扱われます。なので、『指定した文字列』というのも、どの文字コードで指定するかということが重要になります。 #といってもEncoding.GetEncoding()のパラメータかえるだけですけどね。 比較は、配列なんですからループで出来ますよね。

tyn
質問者

補足

返事遅れてすみません。 音声ファイルを16進数でとりこみ、元ファイルの形式に戻すには、どのようにもどしたらよいのですか? 置換方法は例えば『0100FFDO』を『00235121』に書き直して元の音声ファイルとして出力したいのです。 これも文字コードの設定で可能なのでしょうか? また可能ならどの文字コードで出力したらよいのでしょうか? 説明下手くそですみません。

すると、全ての回答が全文表示されます。
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

>『指定した文字列』を『任意の文字列』に置換する方法を教えていただけませんか? 1.『指定した文字列』1文字ずつ切り出し、文字コードにしてをByte型配列に格納。 2.読み込んだファイルの内容と、1で作成した配列の先頭の値を比較し、同じだったら配列の残りの部分も同じかどうか比較する。違ったら読み込んだファイルの比較開始位置をずらす。 3.置換対象個所が見つかったら、『任意の文字列』を1.と同様に1文字ずつ切り出し、文字コードにしてをByte型配列に格納。 >私が出来てる部分は、ファイルを16進数で読み込み置換するまです。 あとは出来ますよね。

tyn
質問者

補足

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim fsIn As New System.IO.FileStream(fileName, _ System.IO.FileMode.Open, System.IO.FileAccess.Read) 'すべて読み込む Dim bytesIn(fsIn.Length - 1) As Byte fsIn.Read(bytesIn, 0, bytesIn.Length) '閉じる fsIn.Close() 'ファイルを書き出す Dim fsOut As New System.IO.FileStream(fileName, _ System.IO.FileMode.Create, System.IO.FileAccess.Write) '復号化されたデータを書き出す fsOut.Write(bytesIn, 0, bytesIn.Length) '閉じる fsOut.Close() '16進数で格納 data1 = BitConverter.ToString(bytesIn).Replace("-", "") 'リッチテキストに出力 RichTextBox1.Text = data1 Dim kensaku, kekka As String kensaku = RichTextBox1.Text kekka = kensaku.Replace(TextBox2.Text, "00007D0000007D00") End Sub こんなソースで書いたのですが、これは全然違いますか?

すると、全ての回答が全文表示されます。

関連するQ&A