当前位置:首页 > JavaScript

js实现crc

2026-04-05 20:26:49JavaScript

CRC 算法简介

CRC(Cyclic Redundancy Check)是一种校验算法,用于检测数据传输或存储中的错误。其核心思想是将数据视为二进制多项式,通过模2除法生成校验码。

CRC 实现步骤

初始化CRC值 通常初始值为0xFFFF(16位CRC)或自定义值,具体取决于CRC标准。

let crc = 0xFFFF; // 16位CRC初始值

定义多项式 常见多项式如CRC-16-CCITT使用0x1021,需根据需求选择。

js实现crc

const polynomial = 0x1021; // CRC-16-CCITT多项式

逐字节处理数据 遍历数据缓冲区,每个字节与当前CRC值进行异或运算,并通过移位操作处理。

function calculateCRC(data) {
  for (let i = 0; i < data.length; i++) {
    crc ^= data[i] << 8;
    for (let j = 0; j < 8; j++) {
      crc = crc & 0x8000 ? (crc << 1) ^ polynomial : crc << 1;
    }
  }
  return crc & 0xFFFF; // 确保结果为16位
}

最终CRC处理 部分算法要求对结果进行额外异或操作(如CRC-16标准需异或0xFFFF)。

js实现crc

crc ^= 0xFFFF; // 可选的后处理步骤

完整示例代码

function crc16(data) {
  let crc = 0xFFFF;
  const polynomial = 0x1021;

  for (let byte of data) {
    crc ^= byte << 8;
    for (let i = 0; i < 8; i++) {
      crc = crc & 0x8000 ? (crc << 1) ^ polynomial : crc << 1;
    }
  }
  return crc & 0xFFFF;
}

// 使用示例
const buffer = new Uint8Array([0x01, 0x02, 0x03]);
console.log(crc16(buffer).toString(16)); // 输出16进制CRC值

不同CRC变体调整

若需实现其他CRC版本(如CRC32),需调整以下参数:

  • 初始值(如CRC32用0xFFFFFFFF)
  • 多项式(如CRC32用0x04C11DB7)
  • 输出异或值(如CRC32用0xFFFFFFFF)

性能优化建议

对于高频调用场景,可预先生成256项的查找表(LUT)加速计算:

const crcTable = Array(256).fill(0).map((_, i) => {
  let crc = i << 8;
  for (let j = 0; j < 8; j++) {
    crc = crc & 0x8000 ? (crc << 1) ^ 0x1021 : crc << 1;
  }
  return crc & 0xFFFF;
});

function crc16Fast(data) {
  let crc = 0xFFFF;
  for (let byte of data) {
    crc = (crc << 8) ^ crcTable[(crc >> 8) ^ byte];
  }
  return crc & 0xFFFF;
}

标签: jscrc
分享给朋友:

相关文章

vue实现js休眠

vue实现js休眠

Vue 中实现 JavaScript 休眠 在 Vue 中实现 JavaScript 休眠通常需要使用异步方式,以避免阻塞主线程。以下是几种常见方法: 使用 setTimeout 和 Promise…

js实现复制功能

js实现复制功能

使用 document.execCommand 方法 这种方法适用于较旧的浏览器,但在现代浏览器中可能被逐步淘汰。通过创建一个临时的 textarea 元素,将文本内容放入其中,然后执行复制命令。…

js实现pdf在线预览

js实现pdf在线预览

使用PDF.js实现PDF在线预览 PDF.js是由Mozilla开发的一个开源JavaScript库,可以在网页中直接渲染PDF文件。以下是实现PDF在线预览的步骤: 引入PDF.js库 在HT…

js 实现链表

js 实现链表

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。与数组不同,链表在内存中是非连续存储的,插入和删除操作效率较高。 链表的实现 在 JavaScrip…

js实现预览

js实现预览

文件上传预览实现 使用JavaScript实现文件上传预览功能,可以通过FileReader对象读取文件内容并显示预览。以下代码支持图片、文本和PDF文件的预览: // HTML部分需要包含inpu…

js实现百叶窗

js实现百叶窗

使用CSS和JavaScript实现百叶窗效果 通过CSS动画和JavaScript事件监听可以实现百叶窗效果。核心思路是将内容区域分割为多个条状元素,通过控制它们的展开/折叠状态来模拟百叶窗。…