Obtenga la diferencia entre archivos binarios usando vcdiff

tortoise.jpg tortoise_bad.jpg


Necesitaba esto para comprender dónde y cómo se corrompió el archivo JPEG durante la transferencia.


VCDIFF : formato y algoritmo para la codificación delta. Descrito en RFC 3284 .

Codificación delta (codificación delta del inglés) : una forma de representar datos en forma de diferencia (delta) entre datos en serie en lugar de los datos en sí.

Por ejemplo, utilizo archivos de texto codificados en Windows-1251 para mayor claridad. Pero con el mismo éxito, estos pueden ser archivos binarios.


Fuentes:


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

Necesita obtener la diferencia entre los archivos:


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

Yo uso el programa xdelta3, pero creo que cualquiera que funcione con el formato vcdiff funcionará.


Como llegar


Necesitaremos otro archivo lleno de espacios:


 " " ( spaces.txt ) 

Debe ser mayor o igual en tamaño al archivo fuente (source.txt)


Equipo:


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

Resultado:


   

Banderas utilizadas:
-e - crea un delta
-A : elimina el exceso de encabezados
-n : elimina crc (no permite usar el delta con otra fuente)
-s [] : la fuente con la que se compara y restaura el archivo de destino
-d : obtiene el archivo de destino delta y fuente


Como funciona


Si ejecuta el comando:


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

Luego, después de todos los encabezados, veremos los comandos 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 

El formato VCDIFF es inherentemente muy simple. Se compone de 3 equipos.


COPY : copia datos de un origen o destino
ADD (agregar): escribe los datos almacenados en el delta en el archivo de destino (cuyos datos únicos no están en la fuente)
RUN (repetir): repite un byte del delta un número específico de veces


Delta almacena solo datos únicos y copia el resto de la fuente. Si ejecuta el comando:


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

Veremos en el delta solo la palabra "cambios" que solo está en el archivo de destino


 D0A6D093D094200102011720131B2009 0302190D0A19200E 

(A JSON no le gustan los caracteres especiales, así que los traduje a HEX )


Si el delta se aplica en la fuente (source.txt), obtenemos el archivo de destino (target.txt)


 xdelta3 -d -s source.txt target.vcdiff    

Reemplazando la fuente (source.txt) con un archivo lleno de espacios (spaces.txt), reemplazamos los datos que se repiten en la fuente y en el archivo de destino con espacios.


 xdelta3 -d -s spaces.txt target.vcdiff  

Puede usar cualquier otro carácter en el archivo spaces.txt. La condición principal es que el archivo spaces.txt es más grande o igual en tamaño que el archivo fuente.


En realidad, comparé archivos JPEG como este:


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

El resultado de comparar estos archivos:


Ver resultado
  F488A2 F2AB 

Muchos espacios y bytes que fueron "superados". Bytes incorrectos transferidos a HEX.


Pruebe los archivos jpeg en los que puede probar los métodos de comparación:


imán tortuga.jpg (18 821 b)imán 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 

El resultado de comparar estos archivos:


Ver resultado
  F1BF F0B786 F39BAF F3BD94 

Bytes incorrectos transferidos a HEX.

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


All Articles