バイナリデータを数値化して比較するには?

解決


シビ  2006-06-24 04:41:16  No: 22269

バイナリデータの比較を行なう時に比較元のメモリを数値化しておいて保存しておいて後から比較する方法があるでしょうか?
画像メモリなのですが、画像が違ったとしても同じ大きさの時にメモリサイズが同じになってしまいます。TMemorystreamのサイズを数値化して保存しておいて画像が違っても同じメモリサイズとなります。
バイナリ比較とサイズ比較では違うので当然の事なのでしょうが、画像が違っても数値化で保存しておいて後で比較できる方法はないでしょうか?
MD5などを使用した方がいいでしょうか?
ただ、MD5に変換するユニットを見つけたのですがそれはファイルから読み込みするものなのでファイルよりもメモリとして読み込みたいと思っています。
MD5よりも他にいい方法などご存知の方がおられればご教授願いたいと思って質問しました。
よろしくお願いします。


igy  2006-06-28 00:34:55  No: 22270

使ったことはありませんが、
CompareMem 関数
はどうですか?


ママん  2006-06-28 02:49:55  No: 22271

ベテラン勢何処行った…

function isSameStream(streamA,streamB:TStream):boolean;
var
  a,b:Byte;
begin
  Result:=False;
  if streamA.Size<>streamB.Size then
    exit;
  streamA.Position:=0;
  streamB.Position:=0;
  repeat
    streamA.Read(a,sizeof(a));
    streamB.Read(b,sizeof(b));
    if a<>b then exit;
  until streamA.Position >= streamA.Size;
  Result:=True;
end;

procedure TForm1.Button1Click(Sender: TObject);
var a,b:TFileStream;
begin
  a:=TFileStream.Create('1.txt',fmOpenRead);
  b:=TFileStream.Create('2.txt',fmOpenRead);
  if isSameStream(a,b) then
    caption:='同じ'
    else
    caption:='違う';
  a.Free;
  b.Free;
end;


シビ  2006-06-29 22:18:48  No: 22272

igyさんありがとうございます

CompareMemを使っていたのですが、大量の画像を扱うためにこの関数では
倍のメモリを使う事になってしまうので動作が遅くなってしまうために
他の方法はないかと考えていました。

ママんさんのサンプルありがとうございます。
目的に合うものができそうです。使わせていただきます。
サンプルはありがたいですね。^^
ところでベテランの方々は、どこにいかれたんですかね^^;
忙しいのでしょうか^^;
ママんさんも一人かもしれませんが、助かりました。
お二方に感謝します^^


ママん  2006-06-30 02:47:53  No: 22273

質問の意味を勘違いして回答してますね…
大きなバイナリファイルを複数と比較を行う際にはMD5は常套かと思われます
どんなMD5のunitか分かりませんが、普通streamから送れるはずですが…


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加