Dapatkan perbedaan antara file biner menggunakan vcdiff

tortoise.jpg tortoise_bad.jpg


Saya membutuhkan ini untuk memahami di mana dan bagaimana file JPEG rusak selama transfer.


VCDIFF - format dan algoritma untuk pengkodean delta. Dijelaskan dalam RFC 3284 .

Delta encoding (Eng. Delta encoding) - cara merepresentasikan data dalam bentuk perbedaan (delta) antara data serial dan bukan data itu sendiri.

Sebagai contoh, saya menggunakan file teks yang disandikan di Windows-1251 untuk kejelasan. Tetapi dengan keberhasilan yang sama, ini bisa berupa file biner.


Sumber:


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

Anda perlu mendapatkan perbedaan antara file:


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

Saya menggunakan program xdelta3, tetapi saya pikir ada orang yang bekerja dengan format vcdiff akan melakukannya.


Bagaimana cara mendapatkannya


Kami akan membutuhkan file lain yang diisi dengan spasi:


 " " ( spaces.txt ) 

Ukurannya harus lebih besar atau sama dengan file sumber (source.txt)


Tim:


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

Hasil:


   

Bendera yang Digunakan:
-e - membuat delta
-A - menghapus kelebihan header
-n - menghapus crc (tidak memungkinkan untuk menggunakan delta dengan sumber lain)
-s [] - sumber yang digunakan untuk membandingkan dan memulihkan file target
-d - dapatkan file target dari delta dan sumber


Bagaimana cara kerjanya


Jika Anda menjalankan perintah:


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

Kemudian setelah semua header kita akan melihat perintah 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 

Format VCDIFF pada dasarnya sangat sederhana. Ini terdiri dari 3 tim.


COPY - menyalin data dari sumber atau target
ADD (add) - menulis data yang disimpan dalam delta ke file target (data unik yang tidak ada di sumber)
RUN (repeat) - mengulangi satu byte dari delta beberapa kali


Delta hanya menyimpan data unik dan menyalin sisanya dari sumber. Jika Anda menjalankan perintah:


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

Kita akan melihat di delta hanya kata "perubahan" yang hanya ada di file target


 D0A6D093D094200102011720131B2009 0302190D0A19200E 

( JSON tidak suka karakter khusus, jadi saya menerjemahkannya ke HEX )


Jika delta diterapkan pada sumber (source.txt), maka kita mendapatkan file target (target.txt)


 xdelta3 -d -s source.txt target.vcdiff    

Mengganti sumber (source.txt) dengan file yang diisi dengan spasi (spasi.txt) kami mengganti data yang diulang dalam sumber dan di file target dengan spasi.


 xdelta3 -d -s spaces.txt target.vcdiff  

Anda dapat menggunakan karakter lain apa pun di file spasi.txt. Kondisi utama adalah bahwa file spasi.txt lebih besar atau berukuran sama dengan file sumber.


Sebenarnya saya membandingkan file JPEG seperti ini:


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

Hasil membandingkan file-file ini:


Lihat hasil
  F488A2 F2AB 

Banyak spasi dan byte yang "dipukuli". Byte buruk ditransfer ke HEX.


Uji file jpeg tempat Anda dapat menguji metode perbandingan:


magnet tortoise.jpg (18 821 b)magnet tortoise_bad.jpg (18 829 b)
tortoise.jpgtortoise_bad.jpg

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

Hasil membandingkan file-file ini:


Lihat hasil
  F1BF F0B786 F39BAF F3BD94 

Byte buruk ditransfer ke HEX.

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


All Articles