PDA

نسخه کامل مشاهده نسخه کامل : سوال در مورد روش مقایسه دو فایل باینری



ali_nob
03-07-2010, 21:27
سلام
من دو فایل باینری رو می خواهم با هم مقایسه کنم و اختلاف اونها رو در یک فایل بانری دیگه ذخیره کنم !
در این خصوص چه کدی رو پیشنهاد می کنید
متشکرم

_H2_
03-07-2010, 23:04
سلام
خوب کد مشکلی ندارد، کافی است از دو FileStream برای خواندن اطلاعات و قرار دادن آنها داخل آرایه های بایتی استفاده کرد.

=====

ولی مشکل سر الگوریتم کار است.
الگوریتم تا پیدا کردن اولین تفاوت بسیار ساده است ...
کافی است دو بافر (آرایه بایتی) را بایت به بایت مقایسه کنید تا به اولین نقطه نا برابر برسید.
از اینجا مسئله کمی مشکل تر میشود.

اولین نقطه تفاوت پیدا شد، ولی ...
- شاید آفست های نظیر دو فایل تا انتها دیگر با هم مچ نشود!
- شاید فایل اول 100 یا 200 یا 5K یا N بایت اطلاعات اضافه داشته باشد و بعد از آن دوباره دو فایل برابر ادامه یابند.
- شاید فایل دوم همان وضعیت قبل را داشته باشد.
- شاید هر دو فایل به تعداد نامشخص و نابرابری بایت غیر برابر داشته باشند ولی بعد از نقطه ای دوباره مشابه هم باشند و این تشابه ادامه یابد.


اگر فایل متنی باشد میتوان راحت تر این حالات را تشریح و کدنویسی کرد و حداقل میتوان کاراکتر Enter را به عنوان معیار پایان خط درز نظر گرفت و بلوکهای خطها را با هم مقایسه کرد.
ولی برای هر فایل باینری کار سخت تر میشود و شما باید همه چهار حالت فوق را در الگوریتمتان پردازش کنید و حالتی که بیشترین تشابه را پیدا میکند معیار قرار دهید، ضمن اینکه الگوریتم شما باید آمادگی برخورد مجدد با نقاط بعدی اختلاف را داشته باشد.

=====

البته در یک رویکرد ساده و سریع میتوان اجبار فرضی مشخص کرد که فقط جاهایی از دو فایل مشابه هستند که حتماً آفست یکسان داشته باشد.

یعنی اگر نقطه 0 تا 1000 دو فایل مشابه بودند و مجدد نقطه 2000 تا 3000 فایل اول و نقطه 5000 تا 6000 فایل دوم برابر بودند، برنامه این تشابه را نادیده گرفته و به عنوان مغایرت فرض کند، چون آفست یا آدرس یکسانی ندارند.

با پیدا نکردن این تشابهات، طبیعتاً الگوریتم ساده میشود.
کافی است یک حلقه ای تشکیل دهید و هر نقطه نظیر به نظیر و آفست به آفست دو فایل که برابر نبودند را با فرمت و شکل و قالب دلخواه در فایل سومی ذخیره کنید.

موفق باشید.