Obtenha a diferença entre arquivos binários usando vcdiff

tortoise.jpg tortoise_bad.jpg


Eu precisava disso para entender onde e como o arquivo JPEG foi corrompido durante a transferência.


VCDIFF - formato e algoritmo para codificação delta. Descrito na RFC 3284 .

Codificação delta (codificação delta da Eng. Delta) - uma maneira de representar dados na forma da diferença (delta) entre os dados seriais em vez dos próprios dados.

Por exemplo, eu uso arquivos de texto codificados no Windows-1251 para maior clareza. Mas com o mesmo sucesso, esses arquivos podem ser binários.


Fontes:


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

Você precisa obter a diferença entre os arquivos:


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

Eu uso o programa xdelta3, mas acho que qualquer um que funcione com o formato vcdiff fará.


Como obter


Vamos precisar de outro arquivo preenchido com espaços:


 " " ( spaces.txt ) 

Ele deve ser maior ou igual em tamanho ao arquivo de origem (source.txt)


Equipa:


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

Resultado:


   

Sinalizadores usados:
-e - cria um delta
-A - remove o excesso de cabeçalhos
-n - remove crc (não permite usar o delta com outra fonte)
-s [] - a fonte com a qual o arquivo de destino é comparado e restaurado
-d - obtém o arquivo de destino do delta e fonte


Como isso funciona


Se você executar o comando:


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

Depois de todos os cabeçalhos, veremos os 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 

O formato VCDIFF é inerentemente muito simples. É composto por 3 equipes.


COPY - copia dados de uma origem ou destino
ADD (adicionar) - grava dados armazenados no delta no arquivo de destino (dados exclusivos dos quais não estão na origem)
RUN (repeat) - repete um byte do delta um número especificado de vezes


A Delta armazena apenas dados exclusivos e copia o restante da fonte. Se você executar o comando:


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

Veremos no delta apenas a palavra "alterações", que está apenas no arquivo de destino


 D0A6D093D094200102011720131B2009 0302190D0A19200E 

( JSON não gosta de caracteres especiais, então eu os traduzi para HEX )


Se o delta é aplicado na fonte (source.txt), obtemos o arquivo de destino (target.txt)


 xdelta3 -d -s source.txt target.vcdiff    

Substituindo a origem (source.txt) por um arquivo preenchido com espaços (spaces.txt), substituímos os dados que são repetidos na origem e no arquivo de destino por espaços.


 xdelta3 -d -s spaces.txt target.vcdiff  

Você pode usar qualquer outro caractere no arquivo spaces.txt. A principal condição é que o arquivo spaces.txt seja maior ou igual em tamanho ao arquivo de origem.


Na verdade, comparei arquivos JPEG como este:


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

O resultado da comparação desses arquivos:


Ver resultado
  F488A2 F2AB 

Muitos espaços e bytes "vencidos". Bytes incorretos transferidos para o HEX.


Teste os arquivos JPEG nos quais você pode testar os métodos de comparação:


ímã Tortoise.jpg (18 821 b)ímã 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 

O resultado da comparação desses arquivos:


Ver resultado
  F1BF F0B786 F39BAF F3BD94 

Bytes incorretos transferidos para o HEX.

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


All Articles