WeStudio技术社区

 找回密码
 立即注册

快捷登录

QQ登录

只需一步,快速开始

查看: 4008|回复: 0

CRC查表法计算

[复制链接]

100

主题

147

帖子

1065

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1065
发表于 2020-6-16 13:54:30 | 显示全部楼层 |阅读模式
本帖最后由 hixon 于 2020-6-16 13:56 编辑

如果我们已经拿到一个C语言版本的CRC查表算法,如果转换成JS版本呢?下面举例说明一下:

CRC 校验算法及函数
  1. static unsigned short crctab[256] =
  2. {
  3. 0x0000,0x8005,0x800f,0x000a,0x801b,0x001e,0x0014,0x8011,
  4. 0x8033,0x0036,0x003c,0x8039,0x0028,0x802d,0x8027,0x0022,
  5. 0x8063,0x0066,0x006c,0x8069,0x0078,0x807d,0x8077,0x0072,
  6. 0x0050,0x8055,0x805f,0x005a,0x804b,0x004e,0x0044,0x8041,
  7. 0x80c3,0x00c6,0x00cc,0x80c9,0x00d8,0x80dd,0x80d7,0x00d2,
  8. 0x00f0,0x80f5,0x80ff,0x00fa,0x80eb,0x00ee,0x00e4,0x80e1,
  9. 0x00a0,0x80a5,0x80af,0x00aa,0x80bb,0x00be,0x00b4,0x80b1,
  10. 0x8093,0x0096,0x009c,0x8099,0x0088,0x808d,0x8087,0x0082,
  11. 0x8183,0x0186,0x018c,0x8189,0x0198,0x819d,0x8197,0x0192,
  12. 0x01b0,0x81b5,0x81bf,0x01ba,0x81ab,0x01ae,0x01a4,0x81a1,
  13. 0x01e0,0x81e5,0x81ef,0x01ea,0x81fb,0x01fe,0x01f4,0x81f1,
  14. 0x81d3,0x01d6,0x01dc,0x81d9,0x01c8,0x81cd,0x81c7,0x01c2,
  15. 0x0140,0x8145,0x814f,0x014a,0x815b,0x015e,0x0154,0x8151,
  16. 0x8173,0x0176,0x017c,0x8179,0x0168,0x816d,0x8167,0x0162,
  17. 0x8123,0x0126,0x012c,0x8129,0x0138,0x813d,0x8137,0x0132,
  18. 0x0110,0x8115,0x811f,0x011a,0x810b,0x010e,0x0104,0x8101,
  19. 0x8303,0x0306,0x030c,0x8309,0x0318,0x831d,0x8317,0x0312,
  20. 0x0330,0x8335,0x833f,0x033a,0x832b,0x032e,0x0324,0x8321,
  21. 0x0360,0x8365,0x836f,0x036a,0x837b,0x037e,0x0374,0x8371,
  22. 0x8353,0x0356,0x035c,0x8359,0x0348,0x834d,0x8347,0x0342,
  23. 0x03c0,0x83c5,0x83cf,0x03ca,0x83db,0x03de,0x03d4,0x83d1,
  24. 0x83f3,0x03f6,0x03fc,0x83f9,0x03e8,0x83ed,0x83e7,0x03e2,
  25. 0x83a3,0x03a6,0x03ac,0x83a9,0x03b8,0x83bd,0x83b7,0x03b2,
  26. 0x0390,0x8395,0x839f,0x039a,0x838b,0x038e,0x0384,0x8381,
  27. 0x0280,0x8285,0x828f,0x028a,0x829b,0x029e,0x0294,0x8291,
  28. 0x82b3,0x02b6,0x02bc,0x82b9,0x02a8,0x82ad,0x82a7,0x02a2,
  29. 0x82e3,0x02e6,0x02ec,0x82e9,0x02f8,0x82fd,0x82f7,0x02f2,
  30. 0x02d0,0x82d5,0x82df,0x02da,0x82cb,0x02ce,0x02c4,0x82c1,
  31. 0x8243,0x0246,0x024c,0x8249,0x0258,0x825d,0x8257,0x0252,
  32. 0x0270,0x8275,0x827f,0x027a,0x826b,0x026e,0x0264,0x8261,
  33. 0x0220,0x8225,0x822f,0x022a,0x823b,0x023e,0x0234,0x8231,
  34. 0x8213,0x0216,0x021c,0x8219,0x0208,0x820d,0x8207,0x0202
  35. };
  36. unsigned short calculateCRC(const unsigned char *cp, unsigned short len)
  37. {
  38. unsigned short crc;unsigned char comb_val;
  39. crc = 0;
  40. while(len--)
  41. {
  42. comb_val = (unsigned char)(crc >> 8) ^ *cp++;
  43. crc = (unsigned short)(crc << 8) ^ crctab[comb_val];
  44. }
  45. return crc;
  46. }
复制代码
转换成JavaScript来实现:
  1. var crctab = [
  2.         0x0000,0x8005,0x800f,0x000a,0x801b,0x001e,0x0014,0x8011,
  3.         0x8033,0x0036,0x003c,0x8039,0x0028,0x802d,0x8027,0x0022,
  4.         0x8063,0x0066,0x006c,0x8069,0x0078,0x807d,0x8077,0x0072,
  5.         0x0050,0x8055,0x805f,0x005a,0x804b,0x004e,0x0044,0x8041,
  6.         0x80c3,0x00c6,0x00cc,0x80c9,0x00d8,0x80dd,0x80d7,0x00d2,
  7.         0x00f0,0x80f5,0x80ff,0x00fa,0x80eb,0x00ee,0x00e4,0x80e1,
  8.         0x00a0,0x80a5,0x80af,0x00aa,0x80bb,0x00be,0x00b4,0x80b1,
  9.         0x8093,0x0096,0x009c,0x8099,0x0088,0x808d,0x8087,0x0082,
  10.         0x8183,0x0186,0x018c,0x8189,0x0198,0x819d,0x8197,0x0192,
  11.         0x01b0,0x81b5,0x81bf,0x01ba,0x81ab,0x01ae,0x01a4,0x81a1,
  12.         0x01e0,0x81e5,0x81ef,0x01ea,0x81fb,0x01fe,0x01f4,0x81f1,
  13.         0x81d3,0x01d6,0x01dc,0x81d9,0x01c8,0x81cd,0x81c7,0x01c2,
  14.         0x0140,0x8145,0x814f,0x014a,0x815b,0x015e,0x0154,0x8151,
  15.         0x8173,0x0176,0x017c,0x8179,0x0168,0x816d,0x8167,0x0162,
  16.         0x8123,0x0126,0x012c,0x8129,0x0138,0x813d,0x8137,0x0132,
  17.         0x0110,0x8115,0x811f,0x011a,0x810b,0x010e,0x0104,0x8101,
  18.         0x8303,0x0306,0x030c,0x8309,0x0318,0x831d,0x8317,0x0312,
  19.         0x0330,0x8335,0x833f,0x033a,0x832b,0x032e,0x0324,0x8321,
  20.         0x0360,0x8365,0x836f,0x036a,0x837b,0x037e,0x0374,0x8371,
  21.         0x8353,0x0356,0x035c,0x8359,0x0348,0x834d,0x8347,0x0342,
  22.         0x03c0,0x83c5,0x83cf,0x03ca,0x83db,0x03de,0x03d4,0x83d1,
  23.         0x83f3,0x03f6,0x03fc,0x83f9,0x03e8,0x83ed,0x83e7,0x03e2,
  24.         0x83a3,0x03a6,0x03ac,0x83a9,0x03b8,0x83bd,0x83b7,0x03b2,
  25.         0x0390,0x8395,0x839f,0x039a,0x838b,0x038e,0x0384,0x8381,
  26.         0x0280,0x8285,0x828f,0x028a,0x829b,0x029e,0x0294,0x8291,
  27.         0x82b3,0x02b6,0x02bc,0x82b9,0x02a8,0x82ad,0x82a7,0x02a2,
  28.         0x82e3,0x02e6,0x02ec,0x82e9,0x02f8,0x82fd,0x82f7,0x02f2,
  29.         0x02d0,0x82d5,0x82df,0x02da,0x82cb,0x02ce,0x02c4,0x82c1,
  30.         0x8243,0x0246,0x024c,0x8249,0x0258,0x825d,0x8257,0x0252,
  31.         0x0270,0x8275,0x827f,0x027a,0x826b,0x026e,0x0264,0x8261,
  32.         0x0220,0x8225,0x822f,0x022a,0x823b,0x023e,0x0234,0x8231,
  33.         0x8213,0x0216,0x021c,0x8219,0x0208,0x820d,0x8207,0x0202
  34.         ];

  35. // 计算CRC, 返回字节数组
  36. calculateCRC = function(data, len) {
  37.     var crc = 0;
  38.     var comb_val;
  39.     var i = 0;
  40.     while(len--) {
  41.         comb_val = ((crc >> 8) ^ data[i++]) & 0xFF;
  42.         crc = ((crc << 8) ^ crctab[comb_val]) & 0xFFFF;
  43.     }
  44.     var crc_h = (crc >> 8) & 0xFF;
  45.     var crc_l = crc & 0xFF;
  46.     return [crc_h, crc_l];
  47. };
复制代码






回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|物一世(北京)科技有限公司 ( 京ICP备20025895 )

GMT+8, 2024-10-13 09:44 , Processed in 0.011958 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表