2012-02-15 12 views
10

मैं बाइट द्वारा ईथरनेट पैकेट बाइट के फ्रेम चेक अनुक्रम (एफसीएस) की गणना करने की कोशिश कर रहा हूं। बहुपद 0x104C11DB7 है। मैं XOR-शिफ़्ट एल्गोरिथ्म यहाँ देखा http://en.wikipedia.org/wiki/Cyclic_redundancy_check या यहाँ http://www.woodmann.com/fravia/crctut1.htmईथरनेट सीआरसी 32 गणना - सॉफ्टवेयर बनाम एल्गोरिदमिक परिणाम

पालन जानकारी है कि माना जाता है कि एक सीआरसी केवल एक बाइट है मान लें किया था। मान लें कि यह 0x03 है।

  1. कदम: सही

    0x0300000000

  2. करने के लिए 32 बिट के साथ पैड बहुपद और अपनी पहली बिट के साथ बाएं हाथ की ओर है कि शून्य नहीं है पर डेटा संरेखित और उन्हें

    XOR

    0x300000000 xor 0x209823B6E = 0x109823b6e

  3. ले शेष संरेखित और XOR फिर

    0x109823b6e xor 0x104C11DB7 = 0x0d4326d9

देखते हैं के बाद से कोई और अधिक बिट छोड़ दिया 0x03 की CRC32 0x0d4326d9

होना चाहिए दुर्भाग्य से सभी सॉफ्टवेयर कार्यान्वयन मुझे बताओ मैं गलत हूँ, लेकिन मैं गलत क्या किया या क्या क्या वे अलग-अलग कर रहे हैं?

अजगर मुझसे कहता है:

"0x%08x" % binascii.crc32(chr(0x03)) 
0x4b0bbe37 

ऑनलाइन उपकरण यहाँ http://www.lammertbies.nl/comm/info/crc-calculation.html#intr एक ही परिणाम हो जाता है। मेरे हाथ की गणना और उल्लिखित सॉफ़्टवेयर उपयोगों के एल्गोरिदम के बीच क्या अंतर है?

अद्यतन:

बाहर बदल जाता है एक ऐसी ही सवाल ढेर अतिप्रवाह पर पहले से ही वहाँ था:

आप हालांकि इस बहुत सहज ज्ञान युक्त नहीं है एक जवाब यहाँ Python CRC-32 woes

पाते हैं। आप यह कैसे ईथरनेट के लिए किया जाता है पर एक और अधिक औपचारिक विवरण चाहते हैं फ्रेम आप Ethernet Standard document 802.3 भाग 3 देख सकते हैं - अध्याय 3.2.9 फ्रेम अनुक्रम फील्ड चेक

चलें ऊपर से एक उदाहरण के लिए जारी:

  1. अपने संदेश के बिट ऑर्डर को उलट दें। यह रिसीवर बिट में थोड़ा सा तरीका आने के तरीके का प्रतिनिधित्व करता है।

    0x03 इसलिए 0xC0

  2. अपने संदेश के पहले 32 बिट पूरक है। ध्यान दें कि हम 32 बिट के साथ एकल बाइट पैड करते हैं।

    0xC000000000 xor 0xFFFFFFFF = 0x3FFFFFFF00

  3. फिर ऊपर से Xor और पारी विधि को पूरा करें। के बारे में 6 चरण के बाद आपको मिलेगा:

    0x13822f2d

  4. ऊपर बिट sequense तो पूरित है।

    0x13822f2d xor 0xFFFFFFFF = 0xec7dd0d2

  5. याद रखें कि हम थोड़ा आदेश चरण एक में ईथरनेट तार पर प्रतिनिधित्व प्राप्त करने के लिए उलट दिया। अब हमें इस कदम को पीछे हटाना है और हम अंततः अपनी खोज को पूरा करते हैं।

    0x4b0bbe37

जो कोई भी यह होना चाहिए करने का इस तरह के साथ आया था ...

आप वास्तव में यह संदेश आप प्राप्त जानना चाहता हूँ कई बार सही है। इसे प्राप्त करने के लिए आप एफसीएस सहित अपना प्राप्त संदेश लेते हैं और उपर्युक्त चरण 1 से 5 तक करते हैं। नतीजा यह होना चाहिए कि वे अवशेष कहें। जो किसी दिए गए बहुपद के लिए निरंतर है। इस मामले में यह 0xC704DD7B है।

mcdowella का उल्लेख है जब तक आप इसे सही हो, आवेदन आप उपयोग कर रहे हैं पर निर्भर करता अपने बिट्स के साथ चारों ओर खेलने के लिए है के रूप में।

+1

0x209823B6E कहां से आता है? – grieve

+0

क्या आपने अपना प्रारंभिक शेष 0xFFFFFFFF – grieve

+0

0x209823B6E को बहुपद के एक स्थानांतरित संस्करण को – sebs

उत्तर

3

सीआरसी गणनाओं को मिलान करने के लिए आम तौर पर परीक्षण और त्रुटि की आवश्यकता होती है, क्योंकि आप कभी भी पढ़ना नहीं चाहते हैं कि वास्तव में क्या किया जाना है। कभी-कभी आपको इनपुट बाइट्स या बहुपद को थोड़ा-विपरीत करना पड़ता है, कभी-कभी आपको गैर-शून्य मान से शुरू करना होता है, और इसी तरह।

इसे बाईपास करने का एक तरीका यह है कि इसे प्राप्त करने वाले कार्यक्रम के स्रोत को देखें, जैसे http://sourceforge.net/projects/crcmod/files/ (कम से कम यह मिलान करने का दावा करता है, और इसके लिए यूनिट परीक्षण के साथ आता है)।

दूसरा एक कार्यान्वयन के साथ खेलना है। उदाहरण के लिए, अगर मैं http://www.lammertbies.nl/comm/info/crc-calculation.html#intr में कैलकुलेटर का उपयोग मैं देख सकते हैं कि दे रही है यह 00000000 0x2144DF1C के सीआरसी पैदा करता है, लेकिन यह दे रही है FFFFFFFF FFFFFFFF पैदा करता है - तो यह वास्तव में बहुपद विभाजन आपके द्वारा बताई गई है, जिसके लिए 0 चेकसम 0

होता नहीं है

स्रोत कोड पर एक त्वरित नज़र से और इन परिणामों में मुझे लगता है कि आपको 0xFFFFFFFF के सीआरसी से शुरू करने की आवश्यकता है - लेकिन मैं गलत हो सकता हूं और आप कार्यान्वयन के साथ अपने कोड पक्ष को डिबग कर सकते हैं, संबंधित प्रिंटफ का उपयोग करके पता लगाने के लिए जहां पहला अंतर होता है, और मतभेदों को एक-एक करके तय करता है।

2

http://en.wikipedia.org/wiki/Cyclic_redundancy_check

ईथरनेट और महत्वपूर्ण जानकारी के धन के लिए सभी डेटा, उदाहरण के लिए वहाँ (कम से कम) 2 सम्मेलनों एक 32-बिट मूल्य में बहुपद एन्कोड करने के लिए, सबसे बड़ा शब्द पहली बार या छोटी से छोटी अवधि के पहले कर रहे हैं है।

2

इंटरनेट पर कई जगहें हैं जहां आप पढ़ेंगे कि एफसीएस की गणना करने से पहले बिट ऑर्डर को उलट दिया जाना चाहिए, लेकिन 802.3 spec उनमें से एक नहीं है।कल्पना के 2008 संस्करण से हवाला देते हुए:

3.2.9 Frame Check Sequence (FCS) field 

A cyclic redundancy check (CRC) is used by the transmit and receive algorithms to 
generate a CRC value for the FCS field. The FCS field contains a 4-octet (32-bit) 
CRC value. This value is computed as a function of the contents of the protected 
fields of the MAC frame: the Destination Address, Source Address, Length/ Type 
field, MAC Client Data, and Pad (that is, all fields except FCS). The encoding is 
defined by the following generating polynomial. 

    G(x) = x32 + x26 + x23 + x22 + x16 + x12 + x11 
      + x10 + x8 + x7 + x5 + x4 + x2 + x + 1 

Mathematically, the CRC value corresponding to a given MAC frame is defined by 
the following procedure: 

a) The first 32 bits of the frame are complemented. 
b) The n bits of the protected fields are then considered to be the coefficients 
    of a polynomial M(x) of degree n – 1. (The first bit of the Destination Address 
    field corresponds to the x(n–1) term and the last bit of the MAC Client Data 
    field (or Pad field if present) corresponds to the x0 term.) 
c) M(x) is multiplied by x32 and divided by G(x), producing a remainder R(x) of 
    degree ≤ 31. 
d) The coefficients of R(x) are considered to be a 32-bit sequence. 
e) The bit sequence is complemented and the result is the CRC. 

The 32 bits of the CRC value are placed in the FCS field so that the x31 term is 
the left-most bit of the first octet, and the x0 term is the right most bit of the 
last octet. (The bits of the CRC are thus transmitted in the order x31, x30,..., 
x1, x0.) See Hammond, et al. [B37]. 

निश्चित रूप से फ्रेम में बिट्स के बाकी उलटे क्रम में प्रेषित कर रहे हैं, लेकिन यह है कि FCS शामिल नहीं है। फिर, कल्पना से:

3.3 Order of bit transmission 

Each octet of the MAC frame, with the exception of the FCS, is transmitted least 
significant bit first. 
+0

यह सिर्फ निहित है कि "पहला बिट" और "अंतिम बिट" ट्रांसमिशन ऑर्डर का संदर्भ देता है - वे * उस कारण के लिए * सबसे महत्वपूर्ण बिट "या" कम से कम महत्वपूर्ण बिट "नहीं कहते हैं :) – hobbs

4

यह अजगर टुकड़ा ईथरनेट के लिए सही सीआरसी लिखते हैं:

# write payload 
for byte in data: 
    f.write('%02X\n' % ord(byte)) 
# write FCS 
crc = zlib.crc32(data)&0xFFFFFFFF 
for i in range(4): 
    b = (crc >> (8*i)) & 0xFF 
    f.write('%02X\n' % b) 

मुझे कुछ समय बचाया है अगर मैं इस यहाँ पाया।

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