2010-12-17 26 views
6

में मैं गणना/संकुचित 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.cbzlib_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)।

+0

'bzip2' AUTODIN द्वितीय, ईथरनेट और एफडीडीआई का उपयोग करता है 32-बिट सीआरसी मानक – soulseekah

+0

सीआरसी असंपीड़ित डेटा इस ब्लॉक में शामिल है कि का उल्लेख नहीं करता है? – psmears

+0

पहली चीज जिसे मैंने कोशिश की थी, सादे, असंपीड़ित डेटा के लिए सीआरसी की गणना की गई थी। लेकिन यह मेल नहीं खाएगा। एक टेक्स्ट फ़ाइल में डेटा एक सरल 'हैलो' था। मैंने अलग-अलग सीआरसी 32 कैलकुलेटर ऑनलाइन और लाइब्रेरी वाले लोगों की कोशिश की जो मेरे पास हैं। या तो मैं बहुत दुर्भाग्यपूर्ण हूं, या मैं कुछ गलत कर रहा हूं। – soulseekah

उत्तर

2

निम्नलिखित bzip2 द्वारा प्रयोग किया जाता सीआरसी एल्गोरिथ्म, पायथन में लिखा है:

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() 

(सी कोड परिभाषाओं bzlib_private.h में लाइनों 155-172 पर पाया जा सकता)

BZ2_crc32Table सरणी/सूची हो सकता है स्रोत कोड से crctable.c में मिला। इस CRC चेकसम एल्गोरिथ्म, है उद्धृत: "..vaguely कोड से रोब Warnock द्वारा, comp.compression पूछे जाने वाले प्रश्न के धारा 51 में ली गई ..." (crctable.c)

चेकसम असम्पीडित डेटा पर गणना कर रहे हैं

सूत्रों का कहना है यहाँ डाउनलोड किया जा सकता है: http://www.bzip.org/1.0.6/bzip2-1.0.6.tar.gz

+0

जावा में bzlib2 सीआरसी कार्यान्वयन यहां है http://www.zetagrid.net/zeta/doc/src/org/apache/tools/bzip2/CRC.java.html – soulseekah