⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 crc calculation.htm

📁 CRC16的源程序
💻 HTM
📖 第 1 页 / 共 2 页
字号:
<!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 + -