バイナリデータの比較を行なう時に比較元のメモリを数値化しておいて保存しておいて後から比較する方法があるでしょうか?
画像メモリなのですが、画像が違ったとしても同じ大きさの時にメモリサイズが同じになってしまいます。TMemorystreamのサイズを数値化して保存しておいて画像が違っても同じメモリサイズとなります。
バイナリ比較とサイズ比較では違うので当然の事なのでしょうが、画像が違っても数値化で保存しておいて後で比較できる方法はないでしょうか?
MD5などを使用した方がいいでしょうか?
ただ、MD5に変換するユニットを見つけたのですがそれはファイルから読み込みするものなのでファイルよりもメモリとして読み込みたいと思っています。
MD5よりも他にいい方法などご存知の方がおられればご教授願いたいと思って質問しました。
よろしくお願いします。
使ったことはありませんが、
CompareMem 関数
はどうですか?
ベテラン勢何処行った…
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;
igyさんありがとうございます
CompareMemを使っていたのですが、大量の画像を扱うためにこの関数では
倍のメモリを使う事になってしまうので動作が遅くなってしまうために
他の方法はないかと考えていました。
ママんさんのサンプルありがとうございます。
目的に合うものができそうです。使わせていただきます。
サンプルはありがたいですね。^^
ところでベテランの方々は、どこにいかれたんですかね^^;
忙しいのでしょうか^^;
ママんさんも一人かもしれませんが、助かりました。
お二方に感謝します^^
質問の意味を勘違いして回答してますね…
大きなバイナリファイルを複数と比較を行う際にはMD5は常套かと思われます
どんなMD5のunitか分かりませんが、普通streamから送れるはずですが…
ツイート | ![]() |