2009-12-22 14 views
40

बाइनरी फ़ाइल के लिए पैच बनाने के बारे में जाने का सबसे अच्छा तरीका क्या है? मैं उपयोगकर्ताओं को आवेदन करने के लिए यह आसान बनाना चाहता हूं (एक साधारण patch एप्लिकेशन अच्छा होगा)। फाइल पर diff चल रहा है बस देता 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 -फाइल विंडोज के लिए केवल – Tino

उत्तर

33

तो मानक patch से कुछ और का उपयोग कर आप के लिए एक विकल्प है, तो आप bsdiff और bspatch की जाँच करने के लिए चाहते हो सकता है:

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

bsdiff और bspatch बाइनरी फाइलों के लिए पैच बनाने और लागू करने के लिए उपकरण हैं। [...]

+2

काफी पुराना स्रोत है। आधुनिक विजुअल स्टूडियो के साथ संकलन करना आसान नहीं है- वीएस 200 9 के साथ यह काम करता है, लेकिन मुझे नए संस्करणों में त्रुटियां मिलीं। इसके अलावा यह केवल 32-बिट है- जो स्मृति खपत से संबंधित एक वास्तविक मुद्दा है (अन्य उत्तरों देखें)। मुझे यकीन नहीं है, अगर x64 के साथ संकलित करना यह ठीक करता है- मैंने .NET पोर्ट पर स्विच किया है, तो अन्य उत्तर देखें। – Philm

+0

'bsdiff' और 'courgette' निष्पादन योग्य बाइनरी के लिए अनुकूलित किए गए हैं; कुछ [अनौपचारिक विंडोज बाइनरी] (http://tpokorra.blogspot.cz/2007/11/bsdiff-for-windows-and-net.html) मिला, लेकिन यह –

0

मान लिया जाये कि क्या आप इस्तेमाल कर सकते हैं एसी/सी फ़ाइल की संरचना पता ++ प्रोग्राम यह बाइट द्वारा बाइट संशोधित करने के लिए:

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

बस पुरानी फाइल में पढ़ा है, और जैसा कि आप चाहें एक नया संशोधित लिखें।

फ़ाइल में फ़ाइल स्वरूप संस्करण संख्या शामिल करना न भूलें ताकि आप फ़ाइल प्रारूप के किसी दिए गए संस्करण को कैसे पढ़ सकें। 10 बार छोटे पैच -

+2

पर तुरंत विफल रहा यह समाधान पागल है। सी/सी ++ का उपयोग करते समय 'sed' पहले से ही वह सब कुछ करता है जिसे आप कभी चाहें। या, यदि आप औद्योगिक-शक्ति पोर्टेबल प्रोग्रामिंग भाषा का उपयोग करना पसंद करते हैं, तो 'perl' आपकी सबसे अच्छी शर्त है। अगर मैं राउटर फर्मवेयर लिख रहा हूं, तो निश्चित रूप से मैं सी या सी ++ के साथ जाऊंगा, लेकिन diffing ...? –

13

Google Courgette tool द्विआधारी diff पैच

comparing with bsdiff का सबसे प्रभावी उपकरण की तरह लग रहा है!

bsdiff अद्यतन 704.512

Courgette अद्यतन 78.848

+3

दस्तावेज़ कहता है, "हमने एक नया diff एल्गोरिदम लिखा है जो हमारे द्वारा दबाए जा रहे डेटा के बारे में और अधिक जानता है - संकलित निष्पादन योग्य वाली बड़ी फ़ाइलें"। निहितार्थ यह है कि यह अन्य द्विआधारी फ़ाइलों के लिए भी काम नहीं करेगा (या शायद बिल्कुल नहीं)। – James

+2

उस लिंक के लिए धन्यवाद। लेकिन यह विंडोज के तहत संकलित करने के लिए एक असली कहानी है। यह पहले एक संपूर्ण डेवलपर सिस्टम स्थापित करता है, उदा। गिट, पायथन, आदि। शायद यह काम करता है, लेकिन मेरी मशीन पर, fetch ने कुछ बंदरगाहों का उपयोग किया है जो सुरक्षित और असफल हो गए थे। किसी को बाइनरी डाउनलोड लिंक पता है? – Philm

+0

@ जेम्स Courgette 'bsdiff' का एक सच्चा उत्तराधिकारी है। दस्तावेज़ से: Courgette 'diff = bsdiff (concat (मूल, अनुमान), अद्यतन)'। उचित 'बीडीएफ' एल्गोरिदम के साथ आपके पास 'लेन (बीडीआईफ़ (कॉन्सट (मूल, अनुमान), अद्यतन है)) Tino

3

आधुनिक बंदरगाह: bsdiff/bspatch के लिए बहुत उपयोगी नेट पोर्ट:

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

मेरा व्यक्तिगत पसंद। मैंने इसका परीक्षण किया, और यह सभी लिंकों में से एकमात्र था, मैं इसे संकलित करने के लिए बॉक्स से बाहर था (विजुअल स्टूडियो के साथ, उदाहरण के लिए 2013)। (सी ++ कहीं और स्रोत थोड़ा पुरानी हो चुकी है और कम से कम एक सा चमकाने की जरूरत है और केवल 32 बिट जो वास्तविक स्मृति (diff स्रोत आकार) सीमा निर्धारित करता है। यह इस सी ++ कोड bsdiff और यहां तक ​​कि परीक्षण के एक बंदरगाह है अगर पैच परिणाम समान हैं है मूल कोड के लिए)।

आगे विचार: .NET 4.5 के साथ आप भी #Zip lib, जो यहाँ एक निर्भरता है से छुटकारा पाने सकता है।

मुझे यह नहीं मापा गया है कि यह सी ++ कोड की तुलना में थोड़ा धीमा है, लेकिन यह मेरे लिए ठीक काम करता है, (बीएसडीएफ: 1-2 एमबी फ़ाइल 1-2 मिनट में), और मेरे लिए समय-महत्वपूर्ण केवल बीएसपीएच है , बीएसडीएफ नहीं।

मैं कर रहा हूँ सच में यकीन नहीं है, अगर एक x64 मशीन की पूरी स्मृति प्रयोग किया जाता है, लेकिन मैं इसे मान। X64 सक्षम निर्माण ("कोई भी CPU") कम से कम काम करता है। एक 100 एमबी फ़ाइल के साथ कोशिश की।

- इसके अलावा: उद्धृत 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 

यह homebrew के माध्यम से पर मैक उपलब्ध है: brew install xdelta

यह और अधिक हाल ही प्रतीत हो रहा है, लेकिन अन्यथा मैं पता नहीं है कि यह कैसे bsdiff जैसे अन्य उपकरणों के लिए तुलना की है।

+0

विंडोज़ बाइनरीज़: [आधिकारिक xdelta3] (https://github.com/jmacd/xdelta-gpl/releases), [अनौपचारिक xdelta] (http://www.evanjones.ca/software/xdelta-win32.html)। –