Downloads

MyBinComp

Público alvo: Usuários avançados querendo ter uma idéia rápida do que está diferente entre dois arquivos binários;
Autor: Eu mesmo 🙂 />
Preço: Gratuito (freeware)
Desenvolvido em: Delphi 5 (Win32 nativo).
Requer: Testado por mim no Windows XP, mas deve ser compatível com todas as outras versões do Windows desde o 9x.

O programa compara arquivos byte por byte e mostra as diferenças de duas formas:

  • Lista: Com a representação decimal, hexadecimal e ASCII do byte diferente;
  • Mapa: Parecido com a representação usada em algumas versões do scandisk e do defrag. Para dar uma idéia mais clara de como as diferenças estão distribuídas.

Se você conhece a estrutura dos arquivos comparados, a visualização em mapa pode esclarecer numa única olhada o motivo da diferença. Por exemplo: se os arquivos forem MP3 e todas as diferenças estiverem concentradas numa região que mais ou menos deve ser a destinada a tags, você sabe que o problema não é de corrupção do arquivo, mas de edição das tags ID3.  Nesse caso a representação textual, em ASCII, também ajuda muito.

Note que no exemplo dado na imagem foram encontradas três diferenças mas existem apenas dois pontos vermelhos no mapa. Isso é normal. Como eu não tenho como mostrar um ponto para cada um dos mil, milhões ou bilhões de bytes existente em um arquivo, cada ponto do mapa representa um “cluster” de bytes cujo tamanho varia com o tamanho do arquivo analisado. Se duas ou mais diferenças caírem no mesmo cluster, só um ponto será exibido.

O programa compara arquivos de qualquer tamanho (inclusive muitos GB) sem diferença no uso de memória, pois são lidos apenas uns poucos KB de cada vez, que são descartados em seguida.

Medidas foram tomadas para que o programa rode também em mídia somente leitura. Ele só não conseguirá salvar a lista dos dois últimos arquivos comparados e demais configurações que você faça posteriormente.

O suporte ao editor hexadecimal FSHED

Desde a versão 0.1.4 MyBinComp tem suporte a exibir o trecho selecionado pelo usuário de duas formas:

  • Clicando no mapa – Exibe toda a região que o cluster representa;
  • Clicando no relatório – Abre no offset mais próximo.

Para isso você precisa do editor hexadecimal freeware FSHED. Se você colocar o exe no mesmo diretório de MyBinComp ele detectará automáticamente, mas você também pode indicar onde está o fshed.exe nas opções.

Estou usando o FSHED porque é o único que achei em uma rápida pesquisa que reconhece offsets nos parâmetros. A maioria dos editores só reconhece nomes de arquivo.

Eu pretendo construir meu próprio editor hexadecimal para dar maior flexibilidade ao programa, mas isso precisa ir para o fim da minha enorme lista de pendências.

Se você conhecer outro editor que suporte offset nos parâmetros, deixe um comentário que eu acrescentarei o suporte a ele.

Velocidade

Para trabalhar com pouca memória, MyBinComp compara pequenos pedaços de cada arquivo alternadamente. Isso tem um efeito ruim quando os dois arquivos estão no mesmo disco rígido, porque a cabeça do drive precisa se mover entre um e outro. Existem algumas coisas que podem ser feitas para minimizar esse efeito,  mas não muito. Principalmente se sua memória RAM livre for muito menor que o tamanho dos arquivos.

Infelizmente meus testes são complicados pelo cache do Windows. Depois da primeira comparação as próximas operações nos mesmos arquivos são muito mais rápidas. Isso esconde o efeito real de qualquer modificação no meu código. Estou procurando meios de apagar ou invalidar o cache do Windows durante o desenvolvimento.

Para futuras versões:

  • Estou testando continuamente idéias para aumentar a velocidade de comparação;
  • A capacidade de esclarecer para o usuário, para alguns tipos de arquivo, qual seria a razão das diferenças.  Por exemplo, identificar se todas as diferenças entre dois arquivos MP3 estão confinadas na área reservada às tags;
  • A capacidade de salvar as diferenças como um patch. Por exemplo, digamos que você tenha modificado uma DLL mas que em vez de distribuir a DLL modificada queira distribuir apenas o arquivo com as diferenças. É claro que essa funcionalidade precisa ser criada juntamente com um programa que possa aplicar os patches. Tal programa já está em desenvolvimento 🙂

Histórico

Versão 0.1.4

  • Eu esqueci (dãããã) que offsets são contados a partir de 0x0, por isso o programa estava reportando offsets adiantados em um byte com relação ao que podia ser visto em qualquer editor. Corrigido;
  • Incluí suporte ao editor FSHED. Mais informações mais acima.

Versão 0.1.3

  • Incluí opções para som em caso de erro e fim da comparação;
  • incluí opção de abortar automaticamente pelo número de diferenças.

Versão 0.1.2

  • Mudança na exibição da representação ASCII;
  • Melhoria no código de geração de lista que pode aumentar a velocidade em 10x em casos extremos;
  • Agora se você pára o mouse sobre um dos nomes de arquivo, o caminho completo aparece em uma hint. Útil para caminhos longos;
  • O programa agora suporta parâmetros, podendo ser evocado diretamente do Treediff através de CTRL-U;
  • Corrigido um bug que provocava uma exception se o processamento levasse menos de um segundo (arquivos pequenos).

Versão 0.1.1

  • Corrigido um bug que provocava Access Violation se houvesse um erro dentro da região atribuída ao primeiro “cluster” do mapa;
  • Incluí um botão “abortar”;
  • Agora o programa só atualiza a lista no final do processo, embora atualize o mapa a cada 1s. Isso é necessário porque em caso de muitas diferenças o programa ficaria extremamente lento. Mas estou avaliando outra forma de atacar o problema.

Versão 0.1

  • Primeira versão pública.

Download

219.5 KiB - 28136 Downloads - Detalhes...

217.7 KiB - 130 Downloads - Detalhes...

204.2 KiB - 83 Downloads - Detalhes...

203.2 KiB - 96 Downloads - Detalhes...

203.0 KiB - 118 Downloads - Detalhes...

13 comments to MyBinComp

  • Encontrei um possível problema no programa, incluindo a versão 0.1.2.

    Em condições normais o programa não requer muita memória, mas como ele coleta informações sobre cada diferença encontrada, se os arquivos foram grandes e radicalmente diferentes pode haver um consumo extraordinário de memória. Vou criar um opção para o programa emitir um alerta caso essa condição ocorra, para que o usuário possa abortar antes de impactar o Windows.

  • Problema minimizado por uma opção na versão 0.1.3

  • Dyeison

    Gostei desse programa. Na verdade gostei mais da sua idéia, de mostrar as alterações no arquivo todo, visualmente. O problema é, como você ja havia dito, quando há muitas diferenças no arquivo; isso o deixa lento. Percebi isso num firmware de receptor de satelite, (com 4MB de tamanho) pois uns 500k dele são diferentes a cada versão.

    Gostaria de dar uma sugestão:
    1. ler um cluster de cada arquivo para um vetor de bytes;
    2. comparar os vetores, ja na memória (até aí acho que já é assim);
    3. quando encontra uma diferença no cluster, pára de ler, marca-o como diferente, vai para o próximo;
    4. para cada cluster lido, armazenar: o offset inicial e se ele é igual ou diferente;
    5. quando o usuário clicar no cluster, ler apenas este cluster, exibindo as diferenças encontradas. Como se tivesse “dando um zoom no cluster”;

    Eu programo (por hobbie) em vb.net, mas no delphi eu não saberia como fazer isso. E como você disse, um leitor desses com mais funcionalidades, já compensa fazer um editor hexadecimal.

    • gostei mais da sua idéia, de mostrar as alterações no arquivo todo, visualmente.

      Foi basicamente por isso que fiz o programa e não recomendei um outro qualquer. Usando outros programas eu sempre me perguntava “mas onde estão essas diferenças”? E somente ficar olhando para números não ajuda muito.

      1. ler um cluster de cada arquivo para um vetor de bytes;
      2. comparar os vetores, ja na memória (até aí acho que já é assim);

      Exatamente. Em uma futura versão o usuário poderá ajustar o tamanho desse cluster para testar por si mesmo se faz diferença. Hoje está fixo em um setor (2048 bytes) porque é o recomendado e nos meus testes não fez diferença aumentar. O cache do Windows tem um papel ativo nisso.

      3. quando encontra uma diferença no cluster, pára de ler, marca-o como diferente, vai para o próximo;
      4. para cada cluster lido, armazenar: o offset inicial e se ele é igual ou diferente;
      5. quando o usuário clicar no cluster, ler apenas este cluster, exibindo as diferenças encontradas. Como se tivesse “dando um zoom no cluster”

      É uma boa idéia.
      Só não começo a implementar agora mesmo porque estou ocupado com outras coisas. Mas vai para a lista “TO DO”.
      Só que será opcional. O usuário terá que escolher explicitamente esse comportamento.

  • Hawk

    Testei no Win2k e funcionou, mas tive que formatar e estou testando no XP-SP2 e está dando erro quando escolho os arquivos e clico em “Comparar”.

    Este é o erro: “Access violation at address 00469ECF in module ‘MyBinComp.exe’. Read the address 00000000.”

    Estou com a versão 0.1.4, testei copiando os arquivos que quero comparar e o ‘MyBinComp’ para a raiz, mas continua aparecendo o mesmo erro.

  • Não entendi. Os arquivos tem tamanhos muito diferentes. Mybincomp só aceita arquivos de mesmo tamanho.

  • Alexandre

    Funcionando perfeitamente no WIN7.
    Uso diariamente o HexWorkshop para comparar arquivos de modulos de injeção eletronica (trabalho com isso) , e o seu software é muito mais simples ,funcional e MUITO mais rápido.
    Parabéns.

  • Marcio

    A idéia parece bem interessante. Pena que só funcione para arquivos de tamanho idêntico. 🙁
    Seria bem legal se aceitasse arquivos de tamanhos diferentes e, sei lá, talvez uma opção para se definir um off-set ou — idealmente — identificar aonde estão as maiores coincidências assim como faz o MELD ou o WinMerge com arquivos texto.
    De qualquer forma, parabéns !

Leave a Reply

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>