2010-12-15 23 views
7

मैं मोटोरोला एचसीएस 088 माइक्रोकंट्रोलर एप्लिकेशन में सीआरसी 16 त्रुटि पहचान जोड़ने की कोशिश कर रहा हूं। हालांकि, मेरे चेकसम मेल नहीं खाते हैं। एक online CRC calculator मेरे पीसी कार्यक्रम में परिणाम और दोनों परिणाम जो मैं माइक्रो पर देखता हूं, प्रदान करता है।सीआरसी 16 चेकसम: एचसीएस08 बनाम केर्मिट बनाम एक्सएमओडीईएम

यह माइक्रो के परिणाम "एक्समोडेम" और पीसी के परिणाम "केर्मिट" कहता है।

उन दो प्राचीन प्रोटोकॉल सीआरसी 16 के उपयोग को निर्दिष्ट करने के तरीके के बीच क्या अंतर है?

उत्तर

17

आप उसी मूल कोड बेस का उपयोग कर 16 बिट आईबीएम, सीसीआईटीटी, एक्समोडेम, केर्मिट और सीसीआईटीटी 1 डी 0 एफ को कार्यान्वित कर सकते हैं। http://www.acooke.org/cute/16bitCRCAl0.html देख जहाँ से http://www.barrgroup.com/Embedded-Systems/How-To/CRC-Calculation-C-Code

कोड का उपयोग करता है निम्न तालिका से पता चलता है कि वे कैसे अलग:

name polynomial initial val reverse byte? reverse result? swap result? 
CCITT   1021   ffff    no    no   no 
XModem  1021   0000    no    no   no 
Kermit  1021   0000   yes    yes   yes 
CCITT 1D0F 1021   1d0f    no    no   no 
IBM   8005   0000   yes    yes   no 

जहां 'रिवर्स बाइट' का अर्थ है कि प्रत्येक बाइट बिट उलट प्रसंस्करण से पहले है, 'रिवर्स परिणाम' का अर्थ है कि 16 बिट परिणाम प्रोसेसिंग के बाद थोड़ा-उलट है; 'स्वैप परिणाम' का अर्थ है कि परिणाम में दो बाइट प्रसंस्करण के बाद बदल दिए जाते हैं।

उपरोक्त सभी को http://www.lammertbies.nl/comm/info/crc-calculation.html (यदि यह गलत है, तो हम सभी खो गए हैं) के खिलाफ परीक्षण वैक्टर के साथ मान्य किए गए थे ...)।

तो, अपने विशेष मामले में, आप XModem से Kermit के लिए कोड को प्रत्येक बाइट को बिट-रिवर्स करके, अंतिम परिणाम को रिवर्स करने और परिणामस्वरूप दो बाइट्स को स्वैप करके परिवर्तित कर सकते हैं।

[मुझे विश्वास है, लेकिन विवरणों की जांच या काम नहीं किया है, जो प्रत्येक बाइट को उलट देता है बहुपद (और कुछ अतिरिक्त विवरण) को उलट करने के बराबर है। यही कारण है कि आप मूल रूप से एक ही एल्गोरिदम के लिए अलग-अलग स्थानों में बहुत अलग स्पष्टीकरण देखेंगे।

भी, उपरोक्त दृष्टिकोण कुशल नहीं है, लेकिन परीक्षण के लिए अच्छा है। आप कुशल चाहते हैं तो सबसे अच्छा होगा ऊपर को देखने-टेबल का अनुवाद है।]

संपादित क्या मैं CCITT ऊपर CCITT-गलत के रूप में RevEng catalogue में प्रलेखित है कहा जाता है। अधिक जानकारी के लिए, उपरोक्त लिंक पर मेरे ब्लॉग पोस्ट में अपडेट देखें।

+0

उत्कृष्ट शोध! – Potatoswatter

+0

आपके लिंक में आप ऊपर दी गई जानकारी के आधार पर लुकअप टेबल जेनरेट करने में सक्षम होने का उल्लेख करते हैं। वह कैसे किया जा सकता है? साथ ही, क्या आप "रिवर्स" वाक्यांश का उपयोग कर रहे हैं और इस लेख का उपयोग करने के तरीके के बीच कोई सहसंबंध है? http://www.danielvik.com/2010/10/calculating-reverse-crc.html सभी को लुकअप टेबल दृष्टिकोण के साथ लागू किया गया है, इसलिए यदि कोई है तो अंतर/समानताएं देखने के लिए मैं संघर्ष कर रहा हूं। धन्यवाद। – NickHalden

+0

@ निकहल्डन नो - वह लेख कुछ अजीब कर रहा है जो आप चाहते हैं कि बहुत ही असंभव है। यह गणना कर रहा है कि पाठ को किसी चीज़ में जोड़ा जाना चाहिए ताकि सीआरसी एक निश्चित मूल्य के साथ बाहर आ जाए। // आप इसे फिर से लिखकर लुकअप टेबल उत्पन्न करने के लिए उपरोक्त कोड का उपयोग करेंगे ताकि एक ही तर्क को 0 से 255 के मानों पर लूप में लागू किया जा सके, और फिर उन मानों को सहेजा और बाद में "आंतरिक लूप" को प्रतिस्थापित करने के लिए उपयोग किया जाता है सीआरसी एल्गोरिदम। –

4

मेरी यादें (मैं मॉडेम सामान को वापस करने के लिए उपयोग करता था) यह है कि किर्मिट कम से कम महत्वपूर्ण बिट का उपयोग करके डेटा के प्रत्येक बाइट में बिट्स को संसाधित करता है।

अधिकांश सॉफ़्टवेयर सीआरसी कार्यान्वयन (Xmodem, शायद) डेटा बाइट्स के माध्यम से सबसे महत्वपूर्ण बिट पहले चलाते हैं।

जब पुस्तकालय स्रोत पर देख रहे हैं (http://www.lammertbies.nl/comm/software/index.html से डाउनलोड) सीआरसी गणना पेज से लिंक के लिए इस्तेमाल किया, तो आप उस XModem CRC16-CCITT, बहुपद जिसके लिए है का उपयोग करता है देखेंगे:

x^16 + x^12 + x^5 + 1 /* the '^' character here represents exponentition, not xor */ 

बहुपद बिटमैप (ध्यान दें कि थोड़ा 16 निहित है)

0x1021 == 0001 0000 0010 0001 binary 

कर्मिट कार्यान्वयन का उपयोग करता का प्रतिनिधित्व करती है:

0x8408 == 1000 0100 0000 1000 binary 

जो एक्समोडेम के समान बिटमैप है, केवल उलट है।

पाठ फ़ाइल के साथ जुडा हुआ पुस्तकालय भी कर्मिट के लिए निम्नलिखित अंतर का उल्लेख है:

केवल सीआरसी कर्मिट और सीआरसी बीमार के लिए

: सभी इनपुट प्रसंस्करण के बाद, सीआरसी में से एक के पूरक गणना की और है सीआरसी के दो बाइट बदल दिए गए हैं।

तो पीसी परिणाम से मेल खाने के लिए शायद अपने सीआरसी दिनचर्या को संशोधित करना आसान होना चाहिए। ध्यान दें कि सीआरसी लाइब्रेरी में स्रोत का एक बहुत उदार लाइसेंस है - यह कम से कम इसका उपयोग करने के लिए समझ में आता है (कम से कम आपके आवेदन के लिए लागू होने वाले भाग)।

+0

यह 9 0% है। इसके अलावा, उस कोड को देखते हुए, सीसीआईटीटी विधि चेकसम में बाइट्स को स्वैप करती है। यदि कोड सी था तो यह आसान होगा ... असल में पीसी का प्रोग्राम लैबव्यू में है, इसलिए वास्तव में यह देखना आसान नहीं था कि चेकसम एल्गोरिदम वास्तव में क्या था। समाधान एक और सीआरसी पुस्तकालय प्राप्त करना था जिसने खुद को सीसीआईटीटी के रूप में विज्ञापित किया, और अपने परिणामों से मेल खाने के लिए मनमाने ढंग से माइक्रो से बाइट को उलट दिया। – Potatoswatter

+0

सीआरसी-केर्मिट और सीआरसी-बीक के लिए सीआरसी के पूरक के बारे में टेक्स्ट फ़ाइल में नोट "कॉपी टाइपो" प्रतीत होता है। उसी टेक्स्ट फ़ाइल में, सीआरसी-डीएनपी के लिए उपरोक्त एक नोट है जो आवश्यक एक के पूरक ऑपरेशन पर चर्चा करता है (जो 'कॉपी टाइपो' सिद्धांत का समर्थन करता है)। स्रोत कोड की परीक्षा यह पुष्टि करने के लिए प्रतीत होती है कि किसी का पूरक ऑपरेशन केवल सीआरसी-डीएनपी पर लागू होता है, न कि सीआरसी-केर्मिट और सीआरसी-बीक। –

संबंधित मुद्दे