
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:
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:
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.