2009-12-22 22 views
40

¿Cuál es la mejor manera de hacer un parche para un archivo binario? Quiero que sea sencillo para los usuarios aplicar (una aplicación simple patch sería bueno). Ejecución de diff en el archivo simplemente da Binary files [...] differ¿Cómo creo parches binarios?

+0

Relacionados: http://stackoverflow.com/questions/688504/binary-diff-tool – miku

+1

Nota: La pregunta http://stackoverflow.com/questions/688504/binary-diff-tool-for-very-large -files es solo para Windows – Tino

Respuesta

33

Si se utiliza algo más que el estándar patch es una opción para usted, es posible que desee comprobar hacia fuera bsdiff y bspatch:

http://www.daemonology.net/bsdiff/

bsdiff y bspatch son herramientas para construir y aplicar parches a archivos binarios. [...]

+2

Fuente muy antigua. No es fácil compilar con Visual Studio moderno, con VS 2009 ha funcionado, pero recibí errores con las versiones más recientes. Además, es solo de 32 bits, que es un problema real relacionado con el consumo de memoria (ver otras respuestas). No estoy seguro, si compilando con x64 corrige esto, cambié a un puerto .NET, veo otra respuesta. – Philm

+0

'bsdiff' y' courgette' están optimizados para binarios ejecutables; encontró algunos [binarios de Windows no oficiales] (http://tpokorra.blogspot.cz/2007/11/bsdiff-for-windows-and-net.html), pero falló de inmediato –

0

suponiendo que conoce la estructura del archivo se puede utilizar c/C++ programa para modificarlo byte a byte:

http://msdn.microsoft.com/en-us/library/c565h7xx(VS.71).aspx

Basta con leer en el archivo de edad, y escriba uno nuevo modificado a su gusto.

No olvide incluir un número de versión de formato de archivo en el archivo para que sepa cómo leer cualquier versión del formato de archivo.

+2

Esta solución es una locura. Usando C/C++ cuando 'sed' ya hace todo lo que podrías desear. O, si prefiere usar un lenguaje de programación portátil de fuerza industrial, 'perl' es su mejor opción. Si estoy escribiendo el firmware del enrutador, por supuesto que iré con C o C++, pero difiriendo ...? –

13

Google Courgette tool se parece más eficaz herramienta para parches diff binarios

comparing with bsdiff - 10 veces más pequeño parche!

actualización bsdiff 704.512

actualización de calabacín 78.848

+3

El documento dice: "escribimos un nuevo algoritmo de diferencias que conoce más sobre el tipo de datos que estamos impulsando: archivos de gran tamaño que contienen ejecutables compilados". La implicación es que no funcionará tan bien (o tal vez nada) para otros archivos binarios. – James

+2

Gracias por ese enlace. Pero es una historia real para compilarlo en Windows. Primero instala todo un sistema de desarrollador, p. Git, Python, etc. Tal vez funcione, pero en mi máquina, la búsqueda ha usado algunos puertos que fueron seguros y fallaron. ¿Alguien sabe un enlace de descarga binario? – Philm

+0

@James Courgette es un verdadero sucesor de 'bsdiff'. Del documento: Courgette 'diff = bsdiff (concat (original, adivinar), actualización)'. Con un algoritmo 'bdiff' razonable tiene' len (bdiff (concat (original, guess), update)) Tino

3

moderno puerto: el puerto NET Muy útil para bsdiff/bspatch:

https://github.com/LogosBible/bsdiff.net

Mi elección personal. Lo probé, y era el único de todos los enlaces; pude compilarlo de inmediato (con Visual Studio, por ejemplo, 2013). (La fuente C++ en otro lugar está un poco desactualizada y necesita al menos un poco de pulido y solo 32 bits que establece límites de memoria real (tamaño de origen de diferencia). Este es un puerto de este código C++ bsdiff e incluso prueba si los resultados del parche son idénticos al código original).

Idea adicional: con .NET 4.5 incluso podría deshacerse de #Zip lib, que es una dependencia aquí.

No he medido si es un poco más lento que el código de C++, pero funcionó bien para mí, (bsdiff: archivo de 90 MB en 1-2 minutos), y el tiempo crítico para mí es solo el bspatch , no el bsdiff.

No estoy muy seguro, si se usa toda la memoria de una máquina x64, pero lo asumo. La construcción capaz de x64 ("Cualquier CPU") funciona al menos. Intentó con un archivo de 100 MB.

- Además: El citado proyecto de Google 'Calabacín' puede ser la mejor opción si su objetivo principal son los archivos ejecutables. Pero es trabajo construirlo (para medidas de Windows, al menos), y para archivos binarios también está utilizando bsdiff/bspatch puro, por lo que he entendido el documento.

9

xdelta es otra opción.

make patch: 

    xdelta3.exe -e -s old_file new_file delta_file 

apply patch: 

    xdelta3.exe -d -s old_file delta_file decoded_new_file 

Está disponible en el Mac a través de homebrew: brew install xdelta

Parece ser más reciente, pero por lo demás no tengo idea de cómo se compara con otras herramientas como bsdiff.

+0

Windows binarios: [xdelta3 oficial] (https://github.com/jmacd/xdelta-gpl/releases), [xdelta no oficial] (http://www.evanjones.ca/software/xdelta-win32.html). –