2009-12-22 9 views
40

바이너리 파일 용 패치를 만드는 가장 좋은 방법은 무엇입니까? 사용자가 간단하게 적용하기를 원합니다 (간단한 patch 응용 프로그램이 좋을 것입니다). 표준 patch 것보다 다른 것을 사용하는 당신을 위해 옵션 인 경우 파일에 DIFF를 실행 당신이 bsdiffbspatch을 확인 할 수 있습니다, Binary files [...] differ바이너리 패치는 어떻게 만듭니 까?

+0

관련 항목 : http://stackoverflow.com/questions/688504/binary-diff-tool – miku

+1

참고 : 질문 http://stackoverflow.com/questions/688504/binary-diff-tool-for-very-large -files는 Windows 전용입니다. – Tino

답변

33

을 제공합니다

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

bsdiff 및 bspatch 패치를 빌드하고 이진 파일에 적용하는 도구입니다. [...]

+2

아주 오래된 소스입니다. 현대적인 Visual Studio와 함께 컴파일하는 것은 쉽지 않습니다. VS 2009에서는 효과가 있었지만 최신 버전에서는 오류가 발생했습니다. 또한 메모리 소비와 관련하여 실제 문제가되는 것은 32 비트뿐입니다 (다른 답변 참조). 확실하지 않다. x64 수정으로 컴파일하면이 .-. NET 포트로 전환했다. 다른 대답을 보라. – Philm

+0

'bsdiff'와'courgette '는 실행 가능한 바이너리에 최적화되어 있습니다; [비공식 Windows 바이너리] (http://tpokorra.blogspot.cz/2007/11/bsdiff-for-windows-and-net.html)를 발견했지만 즉시 실패했습니다. –

0

당신이 AC/C를 사용할 수있는 파일의 구조를 알고 가정 ++ 프로그램은 바이트로 그것을 바이트를 수정 :

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

그냥 이전 파일에 읽고, 원하는대로 수정 한 새로운 것을 작성하십시오.

특정 파일 형식의 버전을 읽는 방법을 알 수 있도록 파일 형식 버전 번호를 파일에 포함하는 것을 잊지 마십시오. 10 배 작은 패치 -

+2

이 솔루션은 제정신이 아닙니다. 'sed'가 이미 할 수있는 모든 일을 C/C++을 사용하여합니다. 아니면, 강력한 성능의 휴대용 프로그래밍 언어를 사용하고 싶다면,'perl'이 최선의 선택입니다. 라우터 펌웨어를 작성한다면 당연히 C 또는 C++로 갈 것이지만 diffing ...? –

13

Google Courgette tool 이진은 diff 패치

comparing with bsdiff에 대한 가장 효율적인 도구처럼 보인다!

bsdiff 업데이트 704512

애호박 업데이트 78,848

+3

이 문서는 "컴파일 된 실행 파일이 포함 된 대용량 파일"에 대해 더 많은 것을 알고있는 새로운 diff 알고리즘을 작성했습니다. 그 의미는 다른 바이너리 파일에서도 잘 작동하지 않을 수도 있습니다. – James

+2

해당 링크를 가져 주셔서 감사합니다. 그러나 Windows에서 컴파일하는 것은 실제 이야기입니다. 먼저 전체 개발자 시스템을 설치합니다. Git, Python, 등등. 아마도 작동하지만 어쩌면 내 컴퓨터에서 가져 오기가 보안되고 실패한 일부 포트를 사용했다. 바이너리 다운로드 링크를 아는 사람이 있습니까? – Philm

+0

@James Courgette는'bsdiff'의 진정한 후계자입니다. 문서에서 : Courgette'diff = bsdiff (concat (원래, 추측), 업데이트)'. 합리적인'bdiff' 알고리즘을 사용하면'len (bdiff (concat (original, guess), update)) Tino

3

현대 포트 : bsdiff/bspatch에 매우 유용 .NET 포트 :

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

내 개인적인 선택. 테스트 한 결과, 모든 링크 중 유일하게 해당 항목을 컴파일 할 수있었습니다 (예 : Visual Studio (예 : 2013)). (다른 곳의 C++ 소스는 약간 구형이며 최소한 비트 폴리싱이 필요하고 실제 메모리 (diff 소스 크기) 제한을 설정하는 32 비트입니다.이 C++ 코드 bsdiff의 포트이며 패치 결과가 동일한 지 여부도 테스트합니다 원래 코드로).

추가 아이디어 : .NET 4.5를 사용하면 #Zip 라이브러리도 제거 할 수 있습니다. 여기에는 종속성이 있습니다.

C++ 코드보다 약간 느린지를 측정하지는 못했지만 (bsdiff : 1 ~ 2 분에 90MB 파일) 시간이 중요한 날에 대해서는 bspatch 만 사용합니다. bsdiff가 아닙니다.

x64 시스템의 전체 메모리가 사용된다면 실제로는 잘 모르겠습니다. x64 가능 빌드 ("모든 CPU")는 최소한 작동합니다. 100MB 파일로 시도했습니다.

-이외 : 인용 된 Google 프로젝트 'Courgette'가 주요 타겟이 실행 파일 인 경우 최선의 선택 일 수 있습니다. 하지만 그것을 구축 (윈도우 측정, 적어도), 그리고 바이너리 파일에 대한 순수한 bsdiff/bspatch를 사용하여, 나는 의사를 이해했습니다.

9

xdelta은 다른 옵션입니다.

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 

그것은 사제를 통해 Mac에서 사용할 수는 : brew install xdelta

은 최근의 것으로 보이지만, 그렇지 않으면 나는 bsdiff 같은 다른 도구를 비교하는 방법 아무 생각이 없습니다.

+0

Windows 바이너리 : [공식 xdelta3] (https://github.com/jmacd/xdelta-gpl/releases), [비공식 xdelta] (http://www.evanjones.ca/software/xdelta-win32.html). –

관련 문제