{"id":2252,"date":"2021-05-02T04:17:06","date_gmt":"2021-05-02T02:17:06","guid":{"rendered":"https:\/\/www.lammertbies.nl\/comm\/info\/on-line-crc-berekening-en-routines"},"modified":"2021-05-17T11:22:22","modified_gmt":"2021-05-17T09:22:22","slug":"crc-calculation","status":"publish","type":"page","link":"https:\/\/www.lammertbies.nl\/nl\/comm\/info\/crc-calculation","title":{"rendered":"On-line CRC berekening en routines"},"content":{"rendered":"\n<ul><li><a href=\"#intr\">Inleiding in CRC berekeningen<\/a><\/li><li><a href=\"https:\/\/www.libcrc.org\/\">Vrij te downloaden CRC routines<\/a><\/li><\/ul>\n<div id=\"CRCBlock\">Laden...<\/div>\n<script type=\"text\/javascript\"><!--\nfunction getcrc() {\nvar xmlHttp; var crc_val; var method_val;\nvar crc = document.getElementById( \"crc\" );\nif ( crc != undefined ) { crc_val = crc.value; if ( crc_val == undefined ) crc_val = '123456789'; } else crc_val = '123456789';\nvar method = document.getElementById( \"methodh\" );\nif ( method != undefined ) { if ( method.checked ) method_val = 'hex'; else method_val = 'ascii'; } else method_val = 'ascii';\nif ( window.ActiveXObject ) { try { xmlHttp = new window.ActiveXObject( \"Msxml2.XMLHTTP\" );\n} catch (er) { try { xmlHttp = new window.ActiveXObject( \"Microsoft.XMLHTTP\" ); } catch (er2) {} } }\nelse if ( window.XMLHttpRequest ) { xmlHttp = new XMLHttpRequest(); if ( xmlHttp.overrideMimeType ) { xmlHttp.overrideMimeType( \"text\/xml\" ); } }\nif ( xmlHttp ) { xmlHttp.onreadystatechange = function() {\nif ( xmlHttp.readyState == 4  &&  xmlHttp.status == 200 ) { document.getElementById( 'CRCBlock' ).innerHTML = xmlHttp.responseText; } }\nxmlHttp.open( \"GET\", \"\/include\/crc-calculation.php?crc=\" + crc_val + \"&method=\" + method_val + \"&lang=nl\", true );\nxmlHttp.send( null );\n} return false; }\n\/\/--><\/script><br><script language=\"JavaScript1.2\" type=\"text\/javascript\">getcrc();<\/script>\n\n\n<h2 class=\"wp-block-heading\" id=\"intr\">Inleiding in CRC berekeningen<\/h2>\n\n<p>Overal waar digitale data wordt opgeslagen of verzonden is de kans op datacorruptie aanwezig. Sinds het begin van computer wetenschap hebben mensen nagedacht hoe met dit type probleem om kan worden gegaan. Voor seri\u00eble data kwamen ze met de oplossing om een <a href=\"https:\/\/www.lammertbies.nl\/nl\/comm\/info\/rs-232-specs#erro\">pariteit bit<\/a> achter elke verzonden byte te plakken. Dit eenvoudige detectie mechanisme werkt alleen, wanneer een oneven aantal bits in een byte verandert, maar een even aantal foutieve bits zal niet worden gedetecteerd door de parity check. Om dit problemen de baas te worden hebben mensen gezocht naar wiskundig correcte mechanismen om meerdere foutieve bits te detecteren. De <strong>CRC<\/strong> of <em>cyclic redundancy check<\/em> is hiervan het resultaat. Tegenwoordig worden CRC berekeningen gebruikt bij alle vormen van communicatie. Alle pakketten die over een network verzonden worden, worden gecontroleerd met een CRC. Ook heeft elk datablok op een harde schijf een daarbij horende CRC waarde. De moderne computerwereld kan niet zonder deze CRC berekeningen. Laten we daarom kijken waarom ze zo breed in gebruik zijn. Het antwoord is eenvoudig, ze zijn krachtig, detecteren vele soorten fouten en ze zijn bijzonder snel te berekenen, met name wanneer daarvoor speciale hardware chips worden gebruikt.<\/p>\n\n<p>Men zou kunnen denken, dat het gebruik van een normale checksum\u2014het optellen van alle datawaarden\u2014reguliere CRC berekeningen kan vervangen. Het is zeker eenvoudiger om een checksum uit te rekenen, maar checksums vinden niet alle soorten fouten. Laten we een voorbeeld string nemen en daar van de \u00e9\u00e9n byte checksum berekenen. De voorbeeld string is \u201c<em>Lammert<\/em>\u201d die converteert naar de <a href=\"https:\/\/www.lammertbies.nl\/nl\/comm\/info\/ascii-characters\">ASCII<\/a> waarden [ <b>76<\/b>, <b>97<\/b>, <b>109<\/b>, <b>109<\/b>, <b>101<\/b>, <b>114<\/b>, <b>116<\/b> ]. De \u00e9\u00e9n byte checksum van deze lijst kan worden berekend door alle waarden op te tellen, dan te delen door <b>256<\/b> en de rest te bewaren. De resulterende checksum is <b>210<\/b>. Je kunt de calculator hierboven gebruiken om dit resultaat te controleren.<\/p>\n\n<p>In dit voorbeeld hebben we een \u00e9\u00e9n byte lange checksum gebruikt die 256 verschillende waarden kan aannemen. Bij het gebruik van een twee byte checksum zal dit resulteren in 65.536 verschillende checksum waarden en als een vier byte waarde wordt gebruikt zijn er meer dan vier miljard mogelijke waarden. We zouden hieruit kunnen concluderen dat met een vier byte checksum de kans dat we per ongeluk een fout niet detecteren kleiner is dan 1 op vier miljard. Dat klinkt aardig, maar is slechts theorie. In de praktijk vallen bits niet puur willekeurig om tijdens communicatie. Ze vallen vaak in rijen achter elkaar, of ten gevolge van elektrische pieken. Laten we aannemen dat in onze voorbeeld lijst het minst significante bit van het karakter \u2018<b>L<\/b>\u2018 wordt gezet, en dat het minst significante bit van karakter \u2018<b>a<\/b>\u2018 verloren raakt tijdens de communicatie. De ontvanger ziet dan de waarden [ <b>77<\/b>, <b>96<\/b>, <b>109<\/b>, <b>109<\/b>, <b>101<\/b>, <b>114<\/b>, <b>116<\/b> ] wat staat voor de string \u201c<em>M`mmert<\/em>\u201c. De checksum van deze nieuwe string is nog steeds <b>210<\/b>, maar het resultaat is duidelijk foutief, slechts nadat twee bits zijn gewijzigd. Zelfs als we een vier byte lange checksum hadden gebruikt zouden we deze transmissie fout niet ontdekt hebben. Dus het berekenen van een checksum mag dan een simpele methode zijn om fouten te detecteren, maar het geeft niet veel meer bescherming dan het pariteitsbit, onafhankelijk van de lengte van de checksum.<\/p>\n\n<p>Het idee van controlewaarde berekening is eenvoudig. Gebruik een functie <em>F(bval,cval)<\/em> dat \u00e9\u00e9n data byte accepteert en een controle waarde en geef vervolgens de herberekende controlewaarde terug. In feite kunnen checksum berekeningen op deze manier worden beschreven. Ons \u00e9\u00e9n byte checksum voorbeeld zou berekend hebben kunnen worden met de volgende functie (in de taal C) die we herhaaldelijk voor elk karakter in de invoerstring aanroepen. De initi\u00eble waarde voor <em>cval<\/em> is 0.<\/p>\n\n<pre><code class=\"language-c\">int F_chk_8( int bval, int cval ) {\n\n    retun ( bval + cval ) % 256;\n\n}<\/code><\/pre>\n\n<p>Het idee achter CRC berekening is om te kijken naar de data als \u00e9\u00e9n groot binair nummer. Dit nummer wordt gedeeld door een bepaalde waarde en de rest van de berekening wordt de CRC genoemd. Delen lijkt op het eerste zicht heel veel rekenkracht te kosten, maar het kan zeer snel worden uitgevoerd wanneer we een methode gebruiken die vergelijkbaar is met die we op school hebben geleerd. We zullen als voorbeeld de rest berekenen van het karakter \u2018<b>m<\/b>\u2018\u2014dat <b>1101101<\/b> is in binaire notatie\u2014door het de delen door <b>19<\/b> of <b>10011<\/b>. Let op, dat 19 een oneven getal is. Dit is nodig zoals we later zullen zien. Voor referentie kunnen de oude schoolboeken gebruikt worden want de hier getoonde binaire berekeningsmethode verschilt niet veel van de decimale methode die we geleerd hebben toen we jong waren. Het lijkt alleen misschien een beetje vreemd. Ook notaties verschillen tussen verschillende landen, maar de methode is vergelijkbaar.<\/p>\n\n<pre><code class=\"language-shell\">                    1 0 1 = 5\n            -------------\n1 0 0 1 1 \/ 1 1 0 1 1 0 1\n            1 0 0 1 1 | |\n            --------- | |\n              1 0 0 0 0 |\n              0 0 0 0 0 |\n              --------- |\n              1 0 0 0 0 1\n                1 0 0 1 1\n                ---------\n                  1 1 1 0 = 14 = remainder<\/code><\/pre>\n\n<p>Met een decimale berekening kan snel worden gecontroleerd dat <b>109<\/b> gedeeld door <b>19<\/b> een quotient geeft van <b>5<\/b> met een rest van <b>14<\/b>. Maar wat we ook zien in dit schema dat elk bit extra dat we willen checken slechts \u00e9\u00e9n binaire vergelijking en in 50% van de gevallen een binaire aftrekking kost. Je kunt eenvoudig het aantal bits in de test data string verhogen\u2014bijvoorbeeld naar 56 bits als we onze voorbeeld string \u201c<em>Lammert<\/em>\u201d gebruiken\u2014en het resultaat kan worden berekend met 56 binaire vergelijkingen en een gemiddelde van 28 binaire aftrekkingen. Dit kan direct in hardware worden ge\u00efmplementeerd, waarbij slechts zeer weinig transistors noodzakelijk zijn. Ook software algoritmes kunnen heel effici\u00ebnt zijn.<\/p>\n\n<p>Voor CRC berekeningen wordt geen normale aftrekking gebruikt, maar alle berekeningen worden <em>modulo 2<\/em> uitgevoerd. In die situatie wordt het overloopbit gemakshalve vergeten en in de praktijk is een aftrekking dan gelijk aan een <em>exclusive or<\/em> operatie. Dit lijkt vreemd, de resulterende rest heeft een andere waarde, maar vanuit een algebra\u00efsch gezichtspunt is de functionaliteit gelijkwaardig. Een discussie hierover zij een universitair kennisniveau van algebra\u00efsche veld theorie noodzakelijk maken en ik denk dat de meeste lezers hierin niet ge\u00efnteresseerd zijn. Kijk aan het eind van dit document voor boeken die hier in detail op in gaan.<\/p>\n\n<p>Nu hebben we een rekenmethode die implementeerbaar is in zowel hardware als software en daarbij ook een meer <em>random<\/em> gevoel uitstraalt dan een ordinaire checksum. Maar hoe gedraagd het zich in de praktijk als \u00e9\u00e9n of meer bits fout zijn? Als we de deler\u201419 in ons voorbeeld\u2014als <em>oneven<\/em> getal kiezen, dan is er weinig hoge school wiskunde voor nodig om te zien dat elke enkelvoudig bit fout zal worden gedetecteerd. Dit is omdat elke enkelevoudige bit fout het deeltal laat veranderen met een macht van 2. Als bijvoorbeeld bit <b>n<\/b> verandert van 0 naar 1, dan zal de waarde van het deeltal toenemen met 2<sup>n<\/sup>. Als aan de andere kant bit <b>n<\/b> verandert van 1 naar 0, zal de waarde van het deeltal afnemen met 2<sup>n<\/sup>. Omdat het niet mogelijk is een macht van twee door een oneven getal te delen zal de rest van de CRC berekening veranderen en zo de fout niet onopgemerkt blijven.<\/p>\n\n<p>De tweede situatie die we willen detecteren is wanneer twee losse bits wijzigen in de data. Hiervoor is enige wiskunde benodigd die kan worden gevonden in Tanenbaum&#8217;s boek dat hieronder genoemd is. Het is nodig de deler heel zorgvuldig te kiezen om er zeker van de zijn dat onafhankelijk van de afstand tussen de twee foute bits een dergelijke fout altijd gedetecteerd worden. Het is bekend dat veel gebruikte waarden 0x8005 en 0x1021 van de CRC16 en CRC-CCITT berekeningen het heel goed doen op dit punt. Let op dat andere getallen wel of niet deze eigenschap hebben en dat het niet eenvoudig te berekenen is welke deler waarde geschikt is voor het detecteren van twee bits fouten en welke niet. Vertrouw daarom op het uitvoerige wiskundige onderzoek op dit punt enkele decennia terug door hoog gekwalificeerde wiskundigen en gebruik de waarden die door deze mensen zijn vastgesteld.<\/p>\n\n<p>Bovendien willen we alle fouten detecteren waarbij een oneven aantal bits wijzigt. Dit kan worden bereikt door een deler te nemen waarbij een even aantal bits gezet is. Wanneer we modulo 2 wiskunde gebruiken valt aan te tonen dat alle fouten met een oneven aantal bits gedetecteerd worden. Zoals ik hiervoor al heb gezegd wordt in modulo 2 berekeningen de aftrekfunctie vervangen door de <em>exclusive or<\/em>. Er zijn vier mogelijke XOR operaties.<\/p>\n\n<pre><code class=\"language-shell\">0 XOR 0 => 0     even => even\n0 XOR 1 => 1     odd  => odd\n1 XOR 0 => 1     odd  => odd\n1 XOR 1 => 0     even => even<\/code><\/pre>\n\n<p>We zien dat voor alle combinaties van bitwaarden de onevenheid van de expressie gelijk blijft. Door een deler te kiezen waarin een even aantal bits is gezet, zal de onevenheid van de rest gelijk zijn aan de onevenheid van het deeltal. Daarom zal, als de onevenheid van het deeltal verandert omdat een oneven aantal bits verandert, de rest ook wijzigen. Dus alle fouten die een oneven aantal bits veranderen zullen worden gedetecteerd door een CRC die met zo een deler is berekend. Je hebt mogelijk gezien dat de vaak gebruikte deler waarden 0x8005 en 0x1021 feitelijk een oneven aantal bits hebben, en niet even zoals hier is aangegeven. Dit is omdat er intern in het algoritme een \u201cverborgen\u201dextra bit 2<sup>16<\/sup> is waardoor de werkelijke deler 0x18005 of 0x11021 wordt in het algoritme.<\/p>\n\n<p>Tenslotte willen we alle zogenaamde burst errors van een bepaalde lengte detecteren en voor burst errors met grotere lengte willen we dat die kans zo groot mogelijk is. Burst errors zijn rijen van bits die door een storing allemaal hoog of laag geworden zijn. Burst errors komen veelvuldig voor in communicatie. Het is het type fout dat het gevolg is van onweer, schakelende relais en dergelijke waarbij gedurende een korte periode alle bits gezet worden. Om dit volledig te begrijpen is ook hier kennis nodig van modulo 2 algebra, dus accepteer alsjeblieft dat met een 16 bits deler het mogelijk is alle burst met een maximale lengte te detecteren van 16 bits, en alle langere bursts met een waarschijnlijkheid van tenminste 99.997%.<\/p>\n\n<p>In een puur mathematische benadering wordt een CRC berekening opgeschreven als polynoom berekeningen. Het deeltal is meestal niet beschreven als een binair getal, maar als een polynoom van een bepaalde orde. In de dagelijkse situatie worden sommige polynomen vaker gebruikt dan anderen. De drie gebruikt in de on-line berekening op deze pagina zijn de 16 bit brede CRC16 en CRCCCITT en de 32 bits brede CRC32. De laatst wordt op dit moment waarschijnlijk het meest gebruikt omdat het ondermeer de CRC generator is voor alle netwerk verkeer verificatie en validatie.<\/p>\n\n<p>Voor alle drie types CRC berekeningen heb ik een <a href=\"https:\/\/www.libcrc.org\/\">vrije software bibliotheek<\/a> beschikbaar gemaakt. Het testprogramma bij de bibliotheek kan direct gebruikt worden om files of strings te testen. Je kunt ook kijken naar de broncodes en deze routines in je eigen programma integreren. Let op de initialisatie waarden van de CRC berekening en mogelijk nodige nabewerking zoals het omgooien van bits. Wanneer je dit niet doet kun je mogelijk andere resultaten krijgen dan andere implementaties. Al dit voor- en nabewerken is gedaan in het voorbeeldprogramma, dus zou het niet de moeilijk moeten zijn om je eigen implementatie werkend te krijgen. Een veel gebruikte test is om de CRC te berekenen van de <a href=\"https:\/\/www.lammertbies.nl\/nl\/comm\/info\/ascii-characters\">ASCII<\/a> string \u201c123456789\u201d. Als de uitvoer van je routine overeenkomt met de uitkomst van het testprogramma op deze website, dan werkt je implementatie en ben je uitwisselbaar met de meeste andere applicaties.<\/p>\n\n<p>Als naslag zijn hier de polynoom functies voor de meest voorkomende CRC berekeningen. Houd in het achterhoofd dat de term met de hoogste orde van de polynoom (x<sup>16<\/sup> of x<sup>32<\/sup>) niet aanwezig is in de binaire nummer representatie, maar door het algoritme zelf ge\u00efmpliceerd wordt.<\/p>\n\n<figure class=\"wp-block-table aligncenter is-style-stripes\"><table><tbody><tr><td>CRC-16<\/td><td>0x8005<\/td><td>x<sup>16<\/sup> + x<sup>15<\/sup> + x<sup>2<\/sup> + 1<\/td><\/tr><tr><td>CRC-CCITT<\/td><td>0x1021<\/td><td>x<sup>16<\/sup> + x<sup>12<\/sup> + x<sup>5<\/sup> + 1<\/td><\/tr><tr><td>CRC-DNP<\/td><td>0x3D65<\/td><td>x<sup>16<\/sup> + x<sup>13<\/sup> + x<sup>12<\/sup> + x<sup>11<\/sup> + x<sup>10<\/sup> + x<sup>8<\/sup> + x<sup>6<\/sup> + x<sup>5<\/sup> + x<sup>2<\/sup> + 1<\/td><\/tr><tr><td>CRC-32<\/td><td>0x04C11DB7<\/td><td>x<sup>32<\/sup> + x<sup>26<\/sup> + x<sup>23<\/sup> + x<sup>22<\/sup> + x<sup>16<\/sup> + x<sup>12<\/sup> + x<sup>11<\/sup> + x<sup>10<\/sup> + x<sup>8<\/sup> + x<sup>7<\/sup> + x<sup>5<\/sup> + x<sup>4<\/sup> + x<sup>2<\/sup> + x<sup>1<\/sup> + 1<\/td><\/tr><\/tbody><\/table><figcaption>Polynoom functies voor gangbare CRC&#8217;s<\/figcaption><\/figure>\n\n<figure class=\"wp-block-table literature is-style-stripes\"><table><thead><tr><th><\/th><th>Literatuur<\/th><th><\/th><\/tr><\/thead><tbody><tr><td><i>2002<\/i><\/td><td><b>Computer Networks<\/b> beschrijft gangbare netwerksystemen en de theorie en algoritmen achter de implementatie.<\/td><td><i>Andrew S. Tanenbaum<\/i><\/td><\/tr><tr><td><i>vele<\/i><\/td><td><b>The Art of Computer Programming<\/b> is h\u00e8t naslagwerk voor seminumerieke algoritmen. Polynoom berekeningen worden diepgaand behandeld. Een minimum niveau van wiskunde is echter wel noodzakelijk om het volledig te volgen.<\/td><td><i>Donald E. Knuth<\/i><\/td><\/tr><tr><td><i>\u2013<\/i><\/td><td><a href=\"https:\/\/www.dnp.org\/\">DNP 3.0, of <em>distributed network protocol<\/em><\/a> is een communicatie protocol dat ontworpen is voor gebruik tussen substation computers, RTUs <em>remote terminal units<\/em>, IEDs <em>intelligent electronic devices<\/em> en hoofdstations voor de elektriciteitsproductie en distributie. Het wordt nu ook gebruikt in vergelijkbare industrie\u00ebn zoals waterzuivering, transport en in de olie- en gasindustrie.<\/td><td><i>DNP User Group<\/i><\/td><\/tr><\/tbody><\/table><figcaption>Literatuur<\/figcaption><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Inleiding in CRC berekeningen Vrij te downloaden CRC routines Inleiding in CRC berekeningen Overal waar digitale data wordt opgeslagen of verzonden is de kans op datacorruptie aanwezig. Sinds het begin van computer wetenschap hebben mensen nagedacht hoe met dit type probleem om kan worden gegaan. Voor seri\u00eble data kwamen ze met de oplossing om een [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":2000,"menu_order":41,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>On-line CRC berekening en routines - Lammert Bies<\/title>\n<meta name=\"description\" content=\"On-line CRC berekeningspagina. Gratis CRC routines te downloaden. CRC-16, CRC-32, CRC-CCITT, DNP, Sick en andere routines.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lammertbies.nl\/nl\/comm\/info\/crc-calculation\" \/>\n<meta property=\"og:locale\" content=\"nl_NL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"On-line CRC berekening en routines - Lammert Bies\" \/>\n<meta property=\"og:description\" content=\"On-line CRC berekeningspagina. Gratis CRC routines te downloaden. CRC-16, CRC-32, CRC-CCITT, DNP, Sick en andere routines.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lammertbies.nl\/nl\/comm\/info\/crc-calculation\" \/>\n<meta property=\"og:site_name\" content=\"Lammert Bies\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/lammertbies\" \/>\n<meta property=\"article:modified_time\" content=\"2021-05-17T09:22:22+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@lammertbies\" \/>\n<meta name=\"twitter:label1\" content=\"Geschatte leestijd\" \/>\n\t<meta name=\"twitter:data1\" content=\"10 minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.lammertbies.nl\/nl\/comm\/info\/crc-calculation\",\"url\":\"https:\/\/www.lammertbies.nl\/nl\/comm\/info\/crc-calculation\",\"name\":\"On-line CRC berekening en routines - Lammert Bies\",\"isPartOf\":{\"@id\":\"https:\/\/www.lammertbies.nl\/nl#website\"},\"datePublished\":\"2021-05-02T02:17:06+00:00\",\"dateModified\":\"2021-05-17T09:22:22+00:00\",\"description\":\"On-line CRC berekeningspagina. Gratis CRC routines te downloaden. CRC-16, CRC-32, CRC-CCITT, DNP, Sick en andere routines.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.lammertbies.nl\/nl\/comm\/info\/crc-calculation#breadcrumb\"},\"inLanguage\":\"nl-NL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.lammertbies.nl\/nl\/comm\/info\/crc-calculation\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.lammertbies.nl\/nl\/comm\/info\/crc-calculation#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.lammertbies.nl\/nl\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Tutorials over computer interfacing\",\"item\":\"https:\/\/www.lammertbies.nl\/nl\/comm\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Communicatie en interfacing informatie\",\"item\":\"https:\/\/www.lammertbies.nl\/nl\/comm\/info\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"On-line CRC berekening en routines\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.lammertbies.nl\/nl#website\",\"url\":\"https:\/\/www.lammertbies.nl\/nl\",\"name\":\"Lammert Bies\",\"description\":\"Computer Interfacing\",\"publisher\":{\"@id\":\"https:\/\/www.lammertbies.nl\/nl#\/schema\/person\/5a6c15bc687da8d8d5ef7407fc62c7ba\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.lammertbies.nl\/nl?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"nl-NL\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/www.lammertbies.nl\/nl#\/schema\/person\/5a6c15bc687da8d8d5ef7407fc62c7ba\",\"name\":\"Lammert Bies\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"nl-NL\",\"@id\":\"https:\/\/www.lammertbies.nl\/nl#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.lammertbies.nl\/wp-content\/uploads\/2021\/04\/lammie.jpg\",\"contentUrl\":\"https:\/\/www.lammertbies.nl\/wp-content\/uploads\/2021\/04\/lammie.jpg\",\"width\":537,\"height\":541,\"caption\":\"Lammert Bies\"},\"logo\":{\"@id\":\"https:\/\/www.lammertbies.nl\/nl#\/schema\/person\/image\/\"},\"description\":\"is a dad, husband and polyglot. He is developing embedded systems since the eighties. Used machine learning before it had a name. Specializes in interconnecting computers, robots and humans. Was a Google Mapmaker Advocate and speaker on several international Google conferences from 2011 until the plug was pulled on Mapmaker in 2017. Currently spreading artificial intelligence to the wildest locations in production environments. He never stops learning.\",\"sameAs\":[\"https:\/\/www.lammertbies.nl\",\"https:\/\/www.facebook.com\/lammertbies\",\"https:\/\/www.linkedin.com\/in\/lammertbies\/\",\"https:\/\/x.com\/lammertbies\",\"https:\/\/bughunter.withgoogle.com\/profile\/1aaf547a-f30a-4145-b7f7-32259a48fa50\",\"https:\/\/github.com\/lammertb\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"On-line CRC berekening en routines - Lammert Bies","description":"On-line CRC berekeningspagina. Gratis CRC routines te downloaden. CRC-16, CRC-32, CRC-CCITT, DNP, Sick en andere routines.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lammertbies.nl\/nl\/comm\/info\/crc-calculation","og_locale":"nl_NL","og_type":"article","og_title":"On-line CRC berekening en routines - Lammert Bies","og_description":"On-line CRC berekeningspagina. Gratis CRC routines te downloaden. CRC-16, CRC-32, CRC-CCITT, DNP, Sick en andere routines.","og_url":"https:\/\/www.lammertbies.nl\/nl\/comm\/info\/crc-calculation","og_site_name":"Lammert Bies","article_publisher":"https:\/\/www.facebook.com\/lammertbies","article_modified_time":"2021-05-17T09:22:22+00:00","twitter_card":"summary_large_image","twitter_site":"@lammertbies","twitter_misc":{"Geschatte leestijd":"10 minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.lammertbies.nl\/nl\/comm\/info\/crc-calculation","url":"https:\/\/www.lammertbies.nl\/nl\/comm\/info\/crc-calculation","name":"On-line CRC berekening en routines - Lammert Bies","isPartOf":{"@id":"https:\/\/www.lammertbies.nl\/nl#website"},"datePublished":"2021-05-02T02:17:06+00:00","dateModified":"2021-05-17T09:22:22+00:00","description":"On-line CRC berekeningspagina. Gratis CRC routines te downloaden. CRC-16, CRC-32, CRC-CCITT, DNP, Sick en andere routines.","breadcrumb":{"@id":"https:\/\/www.lammertbies.nl\/nl\/comm\/info\/crc-calculation#breadcrumb"},"inLanguage":"nl-NL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lammertbies.nl\/nl\/comm\/info\/crc-calculation"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.lammertbies.nl\/nl\/comm\/info\/crc-calculation#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lammertbies.nl\/nl"},{"@type":"ListItem","position":2,"name":"Tutorials over computer interfacing","item":"https:\/\/www.lammertbies.nl\/nl\/comm"},{"@type":"ListItem","position":3,"name":"Communicatie en interfacing informatie","item":"https:\/\/www.lammertbies.nl\/nl\/comm\/info"},{"@type":"ListItem","position":4,"name":"On-line CRC berekening en routines"}]},{"@type":"WebSite","@id":"https:\/\/www.lammertbies.nl\/nl#website","url":"https:\/\/www.lammertbies.nl\/nl","name":"Lammert Bies","description":"Computer Interfacing","publisher":{"@id":"https:\/\/www.lammertbies.nl\/nl#\/schema\/person\/5a6c15bc687da8d8d5ef7407fc62c7ba"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lammertbies.nl\/nl?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"nl-NL"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lammertbies.nl\/nl#\/schema\/person\/5a6c15bc687da8d8d5ef7407fc62c7ba","name":"Lammert Bies","image":{"@type":"ImageObject","inLanguage":"nl-NL","@id":"https:\/\/www.lammertbies.nl\/nl#\/schema\/person\/image\/","url":"https:\/\/www.lammertbies.nl\/wp-content\/uploads\/2021\/04\/lammie.jpg","contentUrl":"https:\/\/www.lammertbies.nl\/wp-content\/uploads\/2021\/04\/lammie.jpg","width":537,"height":541,"caption":"Lammert Bies"},"logo":{"@id":"https:\/\/www.lammertbies.nl\/nl#\/schema\/person\/image\/"},"description":"is a dad, husband and polyglot. He is developing embedded systems since the eighties. Used machine learning before it had a name. Specializes in interconnecting computers, robots and humans. Was a Google Mapmaker Advocate and speaker on several international Google conferences from 2011 until the plug was pulled on Mapmaker in 2017. Currently spreading artificial intelligence to the wildest locations in production environments. He never stops learning.","sameAs":["https:\/\/www.lammertbies.nl","https:\/\/www.facebook.com\/lammertbies","https:\/\/www.linkedin.com\/in\/lammertbies\/","https:\/\/x.com\/lammertbies","https:\/\/bughunter.withgoogle.com\/profile\/1aaf547a-f30a-4145-b7f7-32259a48fa50","https:\/\/github.com\/lammertb"]}]}},"_links":{"self":[{"href":"https:\/\/www.lammertbies.nl\/nl\/wp-json\/wp\/v2\/pages\/2252"}],"collection":[{"href":"https:\/\/www.lammertbies.nl\/nl\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.lammertbies.nl\/nl\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.lammertbies.nl\/nl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lammertbies.nl\/nl\/wp-json\/wp\/v2\/comments?post=2252"}],"version-history":[{"count":0,"href":"https:\/\/www.lammertbies.nl\/nl\/wp-json\/wp\/v2\/pages\/2252\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/www.lammertbies.nl\/nl\/wp-json\/wp\/v2\/pages\/2000"}],"wp:attachment":[{"href":"https:\/\/www.lammertbies.nl\/nl\/wp-json\/wp\/v2\/media?parent=2252"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}