में मैं गणना/संकुचित bzip2 अभिलेखागार के लिए CRC32 चेकसम मान्य करने के लिए कोशिश कर रहा हूँ।गणना/सत्यापित करें BZ2 (bzip2) CRC32 अजगर
.magic:16 = 'BZ' signature/magic number
.version:8 = 'h' for Bzip2 ('H'uffman coding)
.hundred_k_blocksize:8 = '1'..'9' block-size 100 kB-900 kB
.compressed_magic:48 = 0x314159265359 (BCD (pi))
.crc:32 = checksum for this block
...
...
.eos_magic:48 = 0x177245385090 (BCD sqrt(pi))
.crc:32 = checksum for whole stream
.padding:0..7 = align to whole byte
http://en.wikipedia.org/wiki/Bzip2
तो मुझे पता है जहां सीआरसी चेकसम एक BZ2 फ़ाइल में हैं, लेकिन मैं उन्हें सत्यापित करने के बारे में कैसे जाना होगा। दोनों सीआरसी प्राप्त करने के लिए मुझे binascii.crc32()
क्या भाग चाहिए? मैंने विभिन्न हिस्सों, बाइट-बाय-बाइट के सीआरसी की गणना करने की कोशिश की है, लेकिन एक मैच प्राप्त करने में कामयाब नहीं रहा है।
धन्यवाद। मैं bzip2 स्रोतों और bz2
पायथन पुस्तकालय कोड में देख रहा हूं, शायद कुछ खोजने के लिए, खासकर decompress()
विधि में।
अद्यतन 1:
ब्लॉक हेडर जहाँ तक मैं देख सकते हैं निम्नलिखित टैग से पहचाने जाते हैं। लेकिन छोटी bz2 फ़ाइलों में ENDMARK वाले नहीं हैं। (ADW के लिए धन्यवाद, हमें पता चला है कि एक ENDMARK के मूल्यों स्थानांतरित कर दिया बिट के लिए दिखना चाहिए, के बाद से संकुचित डेटा बाइट्स गद्देदार नहीं है।)
#define BLOCK_HEADER_HI 0x00003141UL
#define BLOCK_HEADER_LO 0x59265359UL
#define BLOCK_ENDMARK_HI 0x00001772UL
#define BLOCK_ENDMARK_LO 0x45385090UL
यह bzlib2recover.c
स्रोत से है, ब्लॉक सीआरसी चेकसम से ठीक पहले 80 से शुरू होने लगते हैं, जिसे सीआरसी गणना से छोड़ा जाना चाहिए, क्योंकि कोई भी सीआरसी सीआरसी नहीं कर सकता है जो आपको एक ही सीआरसी (आपको मेरा अंक मिलता है)।
searching for block boundaries ...
block 1 runs from 80 to 1182
इस गणना की गणना करने वाले कोड में देख रहे हैं।
अद्यतन 2:
bzlib2recover.c
सीआरसी की गणना के काम करता है, यह सिर्फ प्रतियां क्षतिग्रस्त फ़ाइलों से सीआरसी जरूरत नहीं है। हालांकि, मैंने bz2
संपीड़ित फ़ाइल में प्रत्येक ब्लॉक की प्रारंभिक और समाप्ति बिट्स को चिह्नित करने के लिए पायथन में ब्लॉक कैलकुलेटर कार्यक्षमता को दोहराने का प्रबंधन किया था। ट्रैक पर वापस, मैंने पाया है कि compress.c
bzlib_private.h
में कुछ परिभाषाओं को संदर्भित करता है।
#define BZ_INITIALISE_CRC(crcVar) crcVar = 0xffffffffL;
#define BZ_FINALISE_CRC(crcVar) crcVar = ~(crcVar);
#define BZ_UPDATE_CRC(crcVar,cha) \
{ \
crcVar = (crcVar << 8)^ \
BZ2_crc32Table[(crcVar >> 24)^ \
((UChar)cha)]; \
}
इन परिभाषाओं bzlib.c
द्वारा पहुँचा रहे हैं और साथ ही, s->blockCRC
आरंभ नहीं हो जाता और bzlib.c
में अद्यतन और compress.c
में अंतिम रूप दिया। सी कोड की 2000 से अधिक लाइनें हैं, जो देखने के लिए कुछ समय लेती हैं और पता लगाती हैं कि क्या हो रहा है और क्या नहीं। मैं प्रश्न में C
टैग भी जोड़ रहा हूं।
वैसे, यहाँ bzip2 के लिए सी सूत्रों http://www.bzip.org/1.0.6/bzip2-1.0.6.tar.gz
अद्यतन 3 हैं:
बाहर कर देता है bzlib2
ब्लॉक CRC32 निम्नलिखित कलन विधि का उपयोग की जाती है:
dataIn
करने के लिए डेटा है एन्कोड किया जाना चाहिए।
crcVar = 0xffffffff # Init
for cha in list(dataIn):
crcVar = crcVar & 0xffffffff # Unsigned
crcVar = ((crcVar << 8)^(BZ2_crc32Table[(crcVar >> 24)^(ord(cha))]))
return hex(~crcVar & 0xffffffff)[2:-1].upper()
कहाँ BZ2_crc32Table, crctable.c
में परिभाषित किया गया है dataIn = "justatest"
लिए सीआरसी लौटे 7948C8CB
है कि डेटा, सीआरसी के साथ एक textfile संकुचित था: BZ2 फाइल के अंदर 32 चेकसम 79 48 c8 cb
है जो एक मैच है।
निष्कर्ष:
bzlib2 CRC32 (हवाले से crctable.c
) है
थोड़ा comp.compression पूछे जाने वाले प्रश्न के धारा 51 में, रोब Warnock द्वारा कोड से प्राप्त ...
... इस प्रकार, जहां तक मैं समझता हूं, मानक सीआरसी 32 चेकसम कैलकुलेटर का उपयोग करके सटीक/मान्य नहीं किया जा सकता है, लेकिन आर एथर को bz2lib
कार्यान्वयन की आवश्यकता है (bzlib_private.h
में लाइन 155-172)।
'bzip2' AUTODIN द्वितीय, ईथरनेट और एफडीडीआई का उपयोग करता है 32-बिट सीआरसी मानक – soulseekah
सीआरसी असंपीड़ित डेटा इस ब्लॉक में शामिल है कि का उल्लेख नहीं करता है? – psmears
पहली चीज जिसे मैंने कोशिश की थी, सादे, असंपीड़ित डेटा के लिए सीआरसी की गणना की गई थी। लेकिन यह मेल नहीं खाएगा। एक टेक्स्ट फ़ाइल में डेटा एक सरल 'हैलो' था। मैंने अलग-अलग सीआरसी 32 कैलकुलेटर ऑनलाइन और लाइब्रेरी वाले लोगों की कोशिश की जो मेरे पास हैं। या तो मैं बहुत दुर्भाग्यपूर्ण हूं, या मैं कुछ गलत कर रहा हूं। – soulseekah