サイズの異なるバイナリファイルの比較をしたい
詳しい方が多そうなのでこちらのカテで質問させて下さい。
●サイズの異なるバイナリファイルの相違を調査できるソフトを探しています。
環境はWindows XPです。
●状況説明
ある動画サイト上の一つの動画を異なるソフトを使いダウンロードしました。
DLする際に、
一方のソフトは無変換と指定しました。(Craving Explorer)
もう一方のソフトには設定項目がありませんでした。(Real Downloader)
その結果、ファイルサイズがほとんど同じの2つの.flv動画ファイルがDLできました。
2つのファイルのサイズは次の通り。
20,163,319 バイト(Craving Explorer)
20,164,410 バイト(Real Downloader)
ファイルサイズがほとんど一緒なので、おそらく動画データ本体は全く一緒で、ヘッダ情報だけが異なっているのではと推測しているのですが、自分の推測が正しいのかどうかを検証するのが目的です。
サイズが異るバイナリファイルの比較が出来るソフトがあれば教えて下さい。
よろしくお願いします。
お礼
>まさか画像を比較するとも考えにくい? 比較するファイルは画像でも良いし、エクセルでもテキストファイルでも良いです。 >、「何を以って、2つのファイルの2つのレコードを、比較すべきものとして捉えるか」 #1さんの参考サイトにあるようなソフトがエクセルで作れないかということです。 PS 知りたいことは最初の質問の通りです。 それ以上のことを逆に聞かれても答えようが有りません。m(__)m
補足
他サイトで教えていた回答を書いておきます。 '=============================================================== Sub main() Dim flnm If get_two_flnm(flnm) = True Then '二つの比較するファイル名を得る ans = file_comp(flnm) 'ファイルの中身の比較 If ans = 0 Then 判定 = "一致しました" ElseIf ans = 1 Then 判定 = "一致しませんでした" Else 判定 = "エラー発生のため判定できませんでした" End If MsgBox flnm(1) & " と" & vbLf & vbLf & flnm(2) & " は、" & vbLf & vbLf & 判定 End If End Sub '=============================================================== Function get_two_flnm(flnm) As Boolean 'Output : flnm(1)とflnm(2) Dim file_array(1 To 2) Dim ans get_two_flnm = True MsgBox "ファイルを選択して下さい" For idx = 1 To 2 ans = Application.GetOpenFilename() If ans <> False Then file_array(idx) = ans If idx = 1 Then MsgBox "比較するファイル指定して下さい" Else get_two_flnm = False Exit For End If Next idx If get_two_flnm = True Then flnm = file_array() End If End Function '=============================================================== Function file_comp(flnm) As Long 'input :flnm(1) flnm(2) Dim buf As String Dim bt1() As Byte Dim bt2() As Byte Dim flio1 As binio Dim flio2 As binio Dim flsz1 As Long Dim flsz2 As Long Dim f_offset1 As Long Dim f_offset2 As Long file_comp = 0 Set flio1 = New binio Set flio2 = New binio If flio1.open_fl(flnm(1), 1024, flsz1) = 0 And _ flio2.open_fl(flnm(2), 1024, flsz2) = 0 Then If flsz1 = flsz2 Then Do While flio1.get_fl(bt1(), f_offset1) = 0 And _ flio2.get_fl(bt2(), f_offset2) = 0 For idx = LBound(bt1()) To UBound(bt1()) If bt1(idx) <> bt2(idx) Then file_comp = 1 End If Next idx Loop Else file_comp = 1 End If Else file_comp = 2 End If flio1.cls_fl flio2.cls_fl Set flio1 = Nothing Set flio2 = Nothing End Function それからクラスモジュール(クラス名はbinioにしました)に、 '=============================================================== Private flno As Long Private restsz As Long Private buffer As Long '=============================================================== Function open_fl(flnm, buffzs As Long, flsize As Long) As Long On Error Resume Next flno = FreeFile() Open flnm For Binary As #flno open_fl = Err.Number If open_fl = 0 Then restsz = LOF(flno) buffer = buffzs flsize = restsz End If On Error GoTo 0 End Function '=============================================================== Sub cls_fl() On Error Resume Next Close #flno On Error GoTo 0 End Sub '=============================================================== Function get_fl(bt() As Byte, g_idx As Long) As Long ' ↑は、ここでは使ってないけどあると便利そうだから On Error Resume Next Dim readbyte As Long If restsz <= 0 Then get_fl = 1 Else If restsz >= buffer Then readbyte = buffer - 1 Else readbyte = restsz - 1 End If g_idx = Loc(flno) ReDim bt(readbyte) Get #flno, , bt() get_fl = Err.Number If get_fl = 0 Then restsz = restsz - readbyte - 1 End If End If On Error GoTo 0 End Function