📄 crc calculation.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0046)http://rcswww.urz.tu-dresden.de/~sr21/crc.html -->
<HTML><HEAD><TITLE>CRC calculation</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META content="Sven Reifegerste" name=author>
<META
content="crc16, crc32, crc, calculator, crc-calculator, crctester.c, crctester, crc-tester"
name=keywords>
<SCRIPT language=JavaScript>
<!--
function resetform()
{
clrpar();
setparcrc32();
document.crcform.data.value="123456789";
}
function clrpar()
{
document.crcform.order.value="";
document.crcform.polynom.value="";
document.crcform.init.value="";
document.crcform.xor.value="";
document.crcform.result.value="";
document.crcform.reflect[0].checked = false;
document.crcform.reflect[1].checked = false;
document.crcform.crcinittype[0].checked=true;
document.crcform.crcinittype[1].checked=false;
setfocus(document.crcform.order);
}
function setparcrcccitt()
{
document.crcform.order.value="16";
document.crcform.polynom.value="1021";
document.crcform.init.value="FFFF";
document.crcform.xor.value="0";
document.crcform.reflect[0].checked = false;
document.crcform.reflect[1].checked = false;
document.crcform.crcinittype[0].checked=false;
document.crcform.crcinittype[1].checked=true;
setfocus(document.crcform.data);
}
function setparcrc16()
{
document.crcform.order.value="16";
document.crcform.polynom.value="8005";
document.crcform.init.value="0";
document.crcform.xor.value="0";
document.crcform.reflect[0].checked = true;
document.crcform.reflect[1].checked = true;
document.crcform.crcinittype[0].checked=false;
document.crcform.crcinittype[1].checked=true;
setfocus(document.crcform.data);
}
function setparcrc32()
{
document.crcform.order.value="32";
document.crcform.polynom.value="4C11DB7";
document.crcform.init.value="FFFFFFFF";
document.crcform.xor.value="FFFFFFFF";
document.crcform.reflect[0].checked = true;
document.crcform.reflect[1].checked = true;
document.crcform.crcinittype[0].checked=false;
document.crcform.crcinittype[1].checked=true;
setfocus(document.crcform.data);
}
function clrdata()
{
document.crcform.data.value="";
setfocus(document.crcform.data);
}
function setfocus(crsr)
{
crsr.focus();
crsr.select();
}
function compute()
{
// computes crc value
var i;
var j;
var k;
var bit;
var datalen;
var len;
var actchar;
var flag;
var counter;
var c;
var crc = new Array (8+1);
var mask = new Array (8);
var hexnum = new Array ("0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F");
var data;
var order;
var polynom = new Array (8);
var init = new Array (8);
var xor = new Array (8);
// check if all entries are present
if (document.crcform.order.value == "" || document.crcform.polynom.value == "" ||
document.crcform.init.value == "" || document.crcform.xor.value == "")
{
document.crcform.result.value= "Invalid parameters";
return;
}
// convert crc order
order=parseInt(document.crcform.order.value, 10);
if (isNaN(order) == true || order<1 || order>64)
{
document.crcform.result.value = "CRC order must be between 1 and 64";
return;
}
// convert crc polynom
polynom = convertentry (document.crcform.polynom.value, order);
if (polynom[0]<0)
{
document.crcform.result.value = "Invalid CRC polynom";
return;
}
// check if polynom is valid (bit 0 must be set)
// if (!(polynom[7]&1))
// {
// document.crcform.result.value = "CRC polynom LSB must be set";
// return;
// }
// convert crc init value
init = convertentry (document.crcform.init.value, order);
if (init[0]<0)
{
document.crcform.result.value = "Invalid initial value";
return;
}
// convert crc xor value
xor = convertentry (document.crcform.xor.value, order);
if (xor[0]<0)
{
document.crcform.result.value = "Invalid XOR value";
return;
}
// generate bit mask
counter = order;
for (i=7; i>=0; i--)
{
if (counter>=8) mask[i] = 255;
else mask[i]=(1<<counter)-1;
counter-=8;
if (counter<0) counter=0;
}
crc = init;
if (document.crcform.crcinittype[0].checked) // nondirect -> direct
{
crc[8] = 0;
for (i=0; i<order; i++)
{
bit = crc[7-((order-1)>>3)] & (1<<((order-1)&7));
for (k=0; k<8; k++) {
crc[k] = ((crc [k] << 1) | (crc [k+1] >> 7)) & mask [k];
if (bit) crc[k]^= polynom[k];
}
}
}
// data = unescape(document.crcform.data.value);
data = document.crcform.data.value;
datalen = data.length;
len=0; // number of data bytes
crc[8]=0;
// main loop, algorithm is fast bit by bit type
for (i=0; i<datalen; i++)
{
c = data.charCodeAt(i);
if (data.charAt(i)=='%') // unescape byte by byte (%00 allowed)
{
if (i>datalen-3)
{
document.crcform.result.value = "Invalid data sequence";
return;
}
ch = parseInt(data.charAt(++i), 16);
if (isNaN(ch) == true)
{
document.crcform.result.value = "Invalid data sequence";
return;
}
c = parseInt(data.charAt(++i), 16);
if (isNaN(c) == true)
{
document.crcform.result.value = "Invalid data sequence";
return;
}
c = (c&15) | ((ch&15)<<4);
}
// perform revin
if (document.crcform.reflect[0].checked)
c = reflectByte(c);
// rotate one data byte including crcmask
for (j=0; j<8; j++)
{
bit=0;
if (crc[7-((order-1)>>3)] & (1<<((order-1)&7))) bit=1;
if (c&0x80) bit^=1;
c<<=1;
for (k=0; k<8; k++) // rotate all (max.8) crc bytes
{
crc[k] = ((crc [k] << 1) | (crc [k+1] >> 7)) & mask [k];
if (bit) crc[k]^= polynom[k];
}
}
len++;
}
// perform revout
if (document.crcform.reflect[1].checked)
crc = reflect(crc, order, 0);
// perform xor value
for (i=0; i<8; i++) crc [i] ^= xor [i];
// write result
document.crcform.result.value = "";
flag=0;
for (i=0; i<8; i++)
{
actchar = crc[i]>>4;
if (flag || actchar)
{
document.crcform.result.value+= hexnum[actchar];
flag=1;
}
actchar = crc[i] & 15;
if (flag || actchar || i==7)
{
document.crcform.result.value+= hexnum[actchar];
flag=1;
}
}
document.crcform.result.value+= " (hex), " + len +" data byte";
if (len!=1) document.crcform.result.value+= "s";
setfocus(document.crcform.data);
}
function revpoly ()
{
// reverses poly
var polynom = new Array (8);
var order;
var actchar;
var flag;
var hexnum = new Array ("0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F");
document.crcform.result.value = "";
// convert crc order
order=parseInt(document.crcform.order.value, 10);
if (isNaN(order) == true || order<1 || order>64)
{
document.crcform.result.value = "CRC order must be between 1 and 64";
return;
}
// convert crc polynom
polynom = convertentry (document.crcform.polynom.value, order);
if (polynom[0]<0)
{
document.crcform.result.value = "Invalid CRC polynom";
return;
}
// check if polynom is valid (bit 0 must be set)
// if (!(polynom[7]&1))
// {
// document.crcform.result.value = "CRC polynom LSB must be set";
// return;
// }
// compute reversed polynom (reflected starting at second LSB that is bit 1)
polynom = reflect(polynom, order, 1)
// write result
document.crcform.result.value = "polynom reversed";
document.crcform.polynom.value = "";
flag=0;
for (i=0; i<8; i++)
{
actchar = polynom[i]>>4;
if (flag || actchar)
{
document.crcform.polynom.value+= hexnum[actchar];
flag=1;
}
actchar = polynom[i] & 15;
if (flag || actchar || i==7)
{
document.crcform.polynom.value+= hexnum[actchar];
flag=1;
}
}
}
function chgtype ()
{
// change crc init type (algorithm dependend)
var init = new Array (8+1);
var order;
var actchar;
var flag;
var mask = new Array (8);
var polynom = new Array (8);
var hexnum = new Array ("0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F");
document.crcform.result.value = "";
// convert crc order
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -