احصل على الفرق بين الملفات الثنائية باستخدام vcdiff

السلحفاة tortoise_bad.jpg


كنت بحاجة إلى ذلك من أجل فهم مكان وكيفية تلف ملف JPEG أثناء النقل.


VCDIFF - تنسيق وخوارزمية لتشفير دلتا. تم وصفه في RFC 3284 .

ترميز دلتا (ترميز دلتا المهندس) - طريقة لتمثيل البيانات في شكل الفرق (دلتا) بين البيانات التسلسلية بدلاً من البيانات نفسها.

على سبيل المثال ، أستخدم ملفات نصية مشفرة في Windows-1251 للتوضيح. ولكن بنفس النجاح ، يمكن أن تكون هذه ملفات ثنائية.


مصادر:


"  " ( source.txt ) "  " ( target.txt ) 

تحتاج إلى معرفة الفرق بين الملفات:


 "  " ( source.txt -> target.txt ) "  " ( target.txt -> source.txt ) 

أستخدم برنامج xdelta3 ، ولكن أعتقد أن أي شخص يعمل مع تنسيق vcdiff سيفعل.


كيف تحصل


سنحتاج إلى ملف آخر مليء بالمسافات:


 " " ( spaces.txt ) 

يجب أن يكون أكبر أو يساوي في الحجم للملف المصدر (source.txt)


الفريق:


 xdelta3 -e -A -n -s source.txt target.txt | xdelta3 -d -s spaces.txt 

النتيجة:


   

الأعلام المستخدمة:
-e - إنشاء دلتا
-A - يزيل الرؤوس الزائدة
-n - يزيل crc (لا يسمح باستخدام دلتا مع مصدر آخر)
-s [] - المصدر الذي تمت مقارنة الملف الهدف به واستعادته
-d احصل على ملف الهدف من دلتا والمصدر


كيف يعمل


إذا قمت بتشغيل الأمر:


 xdelta3 -e -A -n -s source.txt target.txt | xdelta3 printdelta 

ثم بعد كل الرؤوس سنرى أوامر VCDIFF


  Offset Code Type1 Size1 @Addr1 + Type2 Size2 @Addr2 000000 025 CPY_0 9 S@0 000009 010 ADD 9 000018 025 CPY_0 9 S@14 

تنسيق VCDIFF بسيط بطبيعته. يتكون من 3 فرق.


COPY - نسخ البيانات من مصدر أو هدف
ADD (add) - يكتب البيانات المخزنة في دلتا إلى الملف الهدف (البيانات الفريدة ليست في المصدر)
RUN (تكرار) - يكرر بايت واحد من دلتا لعدد محدد من المرات


يخزن دلتا البيانات الفريدة فقط وينسخ الباقي من المصدر. إذا قمت بتشغيل الأمر:


 xdelta3 -e -A -n -s source.txt target.txt > target.vcdiff 

سوف نرى في الدلتا فقط كلمة "التغييرات" الموجودة فقط في الملف الهدف


 D0A6D093D094200102011720131B2009 0302190D0A19200E 

( لا يحب JSON الأحرف الخاصة ، لذلك قمت بترجمتها إلى HEX )


إذا تم تطبيق دلتا على المصدر (source.txt) ، فإننا نحصل على الملف الهدف (target.txt)


 xdelta3 -d -s source.txt target.vcdiff    

استبدال المصدر (source.txt) بملف مليء بمسافات (space.txt) استبدلنا البيانات المكررة في المصدر وفي الملف الهدف بمسافات.


 xdelta3 -d -s spaces.txt target.vcdiff  

يمكنك استخدام أي حرف آخر في ملف space.txt. الشرط الرئيسي هو أن يكون ملف المسافات.txt أكبر أو يساوي الحجم للملف المصدر.


في الواقع قارنت ملفات JPEG مثل هذا:


 xdelta3 -e -A -n -s bad_image.jpg good_image.jpg | xdelta3 -d -s spaces.txt 

نتيجة مقارنة هذه الملفات:


عرض النتيجة
  F488A2 F2AB 

العديد من المساحات والبايتات التي "تعرضت للضرب". تم نقل وحدات البايت التالفة إلى HEX.


اختبار ملفات jpeg التي يمكنك اختبار طرق المقارنة عليها:


المغناطيس السلحفاة. (18 821 ب)المغناطيس tortoise_bad.jpg (18 829 ب)
السلحفاةtortoise_bad.jpg

 xdelta3 -e -A -n -s tortoise_bad.jpg tortoise.jpg | xdelta3 -d -s spaces.txt 

نتيجة مقارنة هذه الملفات:


عرض النتيجة
  F1BF F0B786 F39BAF F3BD94 

تم نقل وحدات البايت التالفة إلى HEX.

Source: https://habr.com/ru/post/ar419883/


All Articles