<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Ralf Eisenreich &#187; crc</title>
	<atom:link href="http://sqlblog.de/blog/tag/crc/feed/" rel="self" type="application/rss+xml" />
	<link>http://sqlblog.de/blog</link>
	<description>SQLBlog.DE &#124; ..things to remember</description>
	<lastBuildDate>Mon, 09 Apr 2012 07:11:16 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>crc &#8211; fehlererkennung</title>
		<link>http://sqlblog.de/blog/2006/03/fehlererkennung-durch-zyklische-redundanzprufung/</link>
		<comments>http://sqlblog.de/blog/2006/03/fehlererkennung-durch-zyklische-redundanzprufung/#comments</comments>
		<pubDate>Wed, 01 Mar 2006 08:25:13 +0000</pubDate>
		<dc:creator>Ralf</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[comment]]></category>
		<category><![CDATA[crc]]></category>
		<category><![CDATA[fehlererkennung]]></category>

		<guid isPermaLink="false">http://blog.ralf-eisenreich.de/blog/index.php/2006/04/07/fehlererkennung-durch-zyklische-redundanzprufung/</guid>
		<description><![CDATA[einsatz die zyklische redundanzprÃ¼fung (crc &#8211; cyclic redundany check) wird vor allem bei der verarbeitung von bitfolgen (Ã¼bertragung, speicherung) genutzt....]]></description>
			<content:encoded><![CDATA[<div class="headline1">einsatz</div>
<p>die zyklische redundanzprÃ¼fung (crc &#8211; cyclic redundany check)         wird vor allem bei der verarbeitung von bitfolgen (Ã¼bertragung,         speicherung) genutzt.<br />
dabei wird einer bitfolge eine fcs (frame check sequence) angehangen,         die meist 12, 16 oder 32 bit lang ist.<br />
damit soll sichergestellt werden, dass die emfangenen daten auch         tatsÃ¤chlich fehlerfrei sind und nicht durch stÃ¶rungen auf dem         Ã¼bertragungsweg (z.b. rauschen der leitung) bitfehler aufgetreten         sind.<br />
diese fehlererkennungsmethode ist viel leistungsfÃ¤higer als         paritÃ¤tsbits oder fehlerprÃ¼fsummen, d.h. man kann also mehr         bitfehler oder bitfehlerfolgen (fehlerbursts) erkennen.<br />
ein weiterer vorteil von crc ist, dass man nur wenige bits (ingesamt         bilden diese die fcs) hinzufÃ¼gen muss, es entsteht also wenig         redundanz.<br />
(redundanz entsteht immer dann wenn einer bitfolge fÃ¼r die         datensequenz &#8220;wertlose&#8221; bits hinzugefÃ¼gt werden.)<br />
bei einem ethernet werden zum beispiel an frames, die 12000bit         groÃŸ sind nur 32bit (fcs) angehangen, trotzdem ist die erkennung         von fehlern bei der fcs als sehr hoch einzuschÃ¤tzen.<br />
erkennt der empfÃ¤nger einer datensequenz einen         Ã¼bertragungsfehler, wird die entsprechende einheit verworfen und         eine erneute Ã¼bertragung beim sender angefordert.</p>
<div class="headline1">grundlage</div>
<p>das crc-verfahren basiert auf einer <strong>bitweisen</strong> (also ohne         Ã¼bertrÃ¤ge!) binÃ¤rarithmetik modulo 2 (was einer         xor-operation entspricht).<br />
es gilt also fÃ¼r addition und subtraktion:</p>
<pre>0 + 1 = 1   1 + 0 = 1   0 - 1 = 1   1 - 0 = 1</pre>
<pre>0 + 0 = 0   1 + 1 = 0   0 - 0 = 0   1 - 1 = 0</pre>
<p>multiplikation wird als sukzessive (bitweise) addition und division als         sukzessive subtraktion ausgefÃ¼hrt:</p>
<pre>1100101        0110001

+ 1010100      - 1010100

--------       --------

0110001        1100101</pre>
<p>der algorithmus basiert nun darauf, dass man die zu Ã¼bertragende         bitfolge (folge von 0en und 1en) als polynome mit den koeffizienten 0         und 1 interpretiert. bei m bits hat man dann m terme &#8212; von b^(m-1) bis         b^0.</p>
<p>hierzu ein beispiel:</p>
<pre>0101101 --> 0 + b^5 + 0 + b^3 + b^2 + 0 + b^0</pre>
<pre>0101101 -->     b^5   +   b^3 + b^2   +   b^0</pre>
<pre>0101101 -->     b^5   +   b^3 + b^2   +   1</pre>
<div class="headline1">funktion</div>
<p>die fcs (frame check sequence) wird mit hilfe eines         generator-polynoms berechnet, das sender und empfÃ¤nger         definieren.<br />
fÃ¼r die weitere betrachtung definieren wir folgendes:<br />
- das generatorpolynom g(b) besteht aus g bits<br />
- das daten-polynom m(b) besteht aus m bits<br />
- r ist der grad der generator-polynoms g(b)<br />
- das daten-polynom t(b) mit fcs besteht aus t bits</p>
<p>einem zu Ã¼bertragenden rahmen (frame) wird nun die fcs angehangen         (man nennt diese auch trailer, anhang). dabei ist der rahmen (der die         datenbits enthÃ¤lt) durch m bits so zu ergÃ¤nzen, dass das         polynom aus datenbits und fcs durch das generatorpolynom teilbar         ist.</p>
<p>&#8211;> der algorithmus:<br />
1.)<br />
anhÃ¤ngen von r 0-bits an das ende des zu Ã¼bertragenden frames         m(b)<br />
der neue rahmen hat jetzt also (m + r) bits, was folgendem polynom         entspricht: b^r * m(b)</p>
<p>2.)<br />
dividiere die bitfolge b^r * m(b) durch die bitfolge des         generator-polynoms g(b) gemÃ¤ÃŸ modulo-2-arithmetik</p>
<p>3.)<br />
der divisionsrest (< = r bits) ist die fcs. diese wird jetzt der zu         Ã¼bertragenden nachricht m(b) angehangen.<br />
das resultat ist die neue zu Ã¼bertragende bitfolge (frame + fcs)         t(b).</p>
<p>&#8211;> anmerkung:<br />
die fcs werden in der praxis einfach mit shift- und xor-registern         berechnet.</p>
<div class="headline1">beispiel</div>
<p>Â· daten-frame: 1101011011<br />
Â· generator-polynom: b^4 + b + 1</p>
<p>&#8211;> daraus folgt<br />
Â· daten-polynom: b^9 + b^8 + b^6 + b^4 + b^3 + b^1 + b^0<br />
Â· generator-frame: 10011</p>
<p>&#8211;> also</p>
<pre>Frame:              1 1 0 1 0 1 1 0 1 1

Generator:          1 0 0 1 1</pre>
<p>&#8211;> hinzufÃ¼gen von r=4 (grad des generators) 0-bits</p>
<pre>Frame mit 0-Bits:   1 1 0 1 0 1 1 0 1 1  0 0 0 0</pre>
<p>&#8211;> division durch generator-polynom g(b)</p>
<pre>Division:

1 1 0 1 0 1 1 0 1 1 0 0 0 0  /  1 0 0 1 1  =  1 1 0 0 0 0 1 0 1 0

1 0 0 1 1 ------------------------------------+ | |             |

---------                                       | |             |

1 0 0 1 1                                     | |             |

1 0 0 1 1 ------------------------------------+ |             |

---------                                       |             |

0 0 0 0 1                                     |             |

0 0 0 0 0 ------------------------------------+    . . .    |

---------                                                   |

0 0 0 1 0                                                 |

0 0 0 0 0                                                 |

---------                                                 |

0 0 1 0 1                                               |

0 0 0 0 0                                               |

---------                                               |

0 1 0 1 1                                             |

0 0 0 0 0                                             |

---------                                             |

1 0 1 1 0                                           |

1 0 0 1 1                                           |

---------                                           |

0 1 0 1 0                                         |

0 0 0 0 0                                         |

---------                                         |

1 0 1 0 0                                       |

1 0 0 1 1                                       |

---------                                       |

0 1 1 1 0                                     |

0 0 0 0 0 ------------------------------------+

---------

1 1 1 0  =  Rest</pre>
<p>&#8211;> es entsteht der frame mit prÃ¼fsumme t(b)</p>
<pre>1 1 0 1 0 1 1 0 1 1  1 1 1 0</pre>
<p>&#8211;> kontrolle<br />
der empfÃ¤nger erhÃ¤t nun die bitfolge t(b) und kann dann,         indem er t(b) durch g(b) dividiert (rechnung Ã¤quivalent zu oben)         Ã¼berprÃ¼fen, ob der frame korrekt Ã¼bertragen wurde. das         ergebnis muss dann nÃ¤mlich einen rest von 0 haben.</p>
<div class="headline1">fehlererkennung</div>
<p>nehmen wir an, die Ã¼bertragung wird gestÃ¶rt und es wird         statt des erwarteten frames t(b) der fehlerhafte frame t(b) + e(b)         empfangen.<br />
jedes 1-bit in e(b) entspricht einem bitfehler, wobei ein einzelnes         1-bit ein singlebitfehler ist und eine 1 gefolgt von 0 oder 1 und         wieder 1 ein burst, (alle anderen bits in e(b) sind 0).</p>
<p>folgende bitfehler kÃ¶nnen also erkannt werden:<br />
1.) singlebitfehler: e(b) = b^i<br />
fÃ¼r die erkennung muss g(b) mindestens 2 terme haben!</p>
<p>2.) 2 singlebitfehler: e(b) = b^i + b^j mit i > j<br />
g(b) darf nicht durch b^k + 1 teilbar sein fÃ¼r k=1..m         (framelÃ¤nge)</p>
<p>3.) ungerade anzahl von bitfehlern:<br />
g(b) muss den faktor b + 1 enthalten!</p>
<p>4.) burstfehler:<br />
ein polynom des grads r erkennt alle burstfehler einer lÃ¤nge < =         r.<br />
dazu muss g(b) einen b^0-term enthalten. bursts der lÃ¤nge r+1         werden mit einer wahrscheinlichkeit von 0.5^(r-1) nicht erkannt.<br />
die gesamtwahrscheinlichkeit, dass ein gestÃ¶rter frame durchkommt,         ist 0.5^r, unter der voraussetzung, dass alle bitmuster         gleichmÃ¤ssig verteilt sind.</p>
<div class="headline1">standardpolynome<br />
hier ist eine auflistung getesteter standard polynome:</p>
<pre>Â· <strong>crc-8</strong>:     b^8 + b^2 + 11 (atm)

Â· <strong>crc-10</strong>:    b^10 + b^9 + b^5 + b^4 +b^1 + 1 (atm)

Â· <strong>crc-12</strong>:    b^12 + b^11 + b^3 + b^2 + b^1 + 1

Â· <strong>crc-16</strong>:    b^16 + b^15 + b^2 + 1

Â· <strong>crc-ccitt</strong>: b^16 + b^12 + b^5 + 1 (hdlc)

Â· <strong>crc-32</strong>:    b^32 + b^26 + ... + b^2 + b^1 + 1 (ethernet, fddi)</pre>
]]></content:encoded>
			<wfw:commentRss>http://sqlblog.de/blog/2006/03/fehlererkennung-durch-zyklische-redundanzprufung/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

