天道酬勤,学无止境

Javascript CRC16 sample code or implementation

can anybody share a link or sample code to implement checksum for string in javascript? Thanks a lot in advance

标签

评论

What do you want?

You need to be more specific.

There is a huge plethora of CRC16 algorithms, each one with its own polynomial and for a specific use. Some CRC16 algorithms are really good to create hashes ( for Redis, for example ) while others are better for wire communication.

  • https://en.wikipedia.org/wiki/Cyclic_redundancy_check#Polynomial_representations_of_cyclic_redundancy_checks

I just want anything, I really don't care what

If this is the road you want to go with, then GitHub and NPM have many implementations that could work for you.

Their documentation is usually downright horrible or non-existent and there is no guarantee they will work as advertised, but if anything goes, you can always give them a try, and if you find a bug you can always report it in their issues page.

Here is a quick implementation I found, should be what you need:

  • https://github.com/donvercety/node-crc16/blob/master/crc16.js

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 轻量级校验和算法的好选择?(Good choice for a lightweight checksum algorithm?)
    问题 我发现自己需要为一串数据生成校验和,以保持一致性。 广泛的想法是客户端可以根据它收到的有效负载重新生成校验和,从而检测传输过程中发生的任何损坏。 我隐约意识到这种事情背后有各种各样的数学原理,如果你自己尝试滚动,很容易出现细微的错误,使整个算法无效。 因此,我正在寻找有关具有以下标准的散列/校验和算法的建议: 它将由 Javascript 生成,因此需要相对较轻的计算。 验证将由 Java 完成(尽管我看不出这实际上是一个问题)。 它将采用中等长度的文本输入(URL 编码的 Unicode,我认为是 ASCII); 通常大约 200-300 个字符,并且在所有情况下都低于 2000。 输出也应该是 ASCII 文本,越短越好。 我主要对轻量级的东西感兴趣,而不是获得绝对最小的碰撞可能性。 我会天真地想象一个八字符的哈希值适合这个吗? 我还应该澄清,如果在验证阶段没有发现损坏,这并不是世界末日(我确实意识到这不会是 100% 可靠的),尽管我的其余代码对于每个漏掉的损坏条目。 编辑 - 感谢所有贡献者。 我选择了 Adler32 选项,考虑到它在 Java 中得到本机支持,在 Javascript 中非常容易实现,在两端快速计算并且有一个 8 字节的输出,它完全符合我的要求。 (请注意,我意识到网络传输不太可能对任何损坏错误负责,并且暂时不会在这个问题上折叠我的手臂
  • CRC 逆向工程师(来自机器/PC 的校验和)(CRC Reverse Engineer (Checksum from Machine / PC))
    问题 我目前正在寻找如何确定从机器到 PC 产生的 CRC(反之亦然)。 设备使用串行通信或 RS232 电缆进行通信。 I do only have data to be able for us to create a program to be used for both devices. The data given was from my boss and the program was corrupted. So we are trying for it to work out. I hope everyone can help. Thanks :) 回答1 The sequence to use for the CRC calculation in your protocol is the ASCII string starting from the first printing character (e.g. the 'R' from REQ) until and including the '1E' in the calculation. It's a CRC with the following specs according to our CRC calculator CRC:16,1021,0000,0000,No,No which means: CRC
  • 可以使用CRC32C作为基础构造一个“好的”哈希函数吗?(Can one construct a “good” hash function using CRC32C as a base?)
    问题 鉴于SSE 4.2(Intel Core i7和i5部件)包含CRC32指令,研究是否可以构建更快的通用哈希函数似乎是合理的。 据此,仅CRC32的16位均匀分布。 那么,还有哪些其他变革可以克服这一挑战呢? 更新如何? 仅16位适用于哈希值。 美好的。 如果您的表是65535或更小,那就好。 如果不是,请通过Nehalem POPCNT(填充计数)指令运行CRC值,以获取设置的位数。 然后,将其用作表数组的索引。 如果您的桌子在1mm入口以南,则此方法有效。 我敢打赌,比性能最好的哈希函数便宜/快。 既然GCC 4.5具有CRC32内在函数,那么应该很容易进行测试……如果只有我有大量的业余时间来进行处理的话。 大卫 回答1 再次访问,2014年8月由Arnaud Bouchez在最近的评论中提出,并考虑到其他答案和评论,我承认,原始答案需要更改,或者最不合格。 最后,我保留了原样以供参考。 首先,也许是最重要的一个问题的合理答案取决于哈希码的预期用途:“好” [哈希函数...]是什么意思? 哈希将在哪里/如何使用? (例如,用于散列相对较短的输入密钥吗?是否用于索引/查找目的,以生成消息摘要或其他用途?[CRC32或其衍生物的全部32位]所需的散列代码本身需要多长时间?位,更少...等等? OP提出了“更快的通用哈希函数”的问题,因此重点放在SPEED
  • 为什么将 xor 与文字一起使用而不是反转(按位不是)(Why use xor with a literal instead of inversion (bitwise not))
    问题 我遇到过这个 CRC32 代码,很好奇作者为什么会选择使用 crc = crc ^ ~0U; 代替 crc = ~crc; 据我所知,它们是等效的。 我什至在 Visual Studio 2010 中反汇编了这两个版本。 未优化构建: crc = crc ^ ~0U; 009D13F4 mov eax,dword ptr [crc] 009D13F7 xor eax,0FFFFFFFFh 009D13FA mov dword ptr [crc],eax crc = ~crc; 011C13F4 mov eax,dword ptr [crc] 011C13F7 not eax 011C13F9 mov dword ptr [crc],eax 我也无法通过考虑每条指令所花费的周期数来证明代码的合理性,因为两者都应该花费 1 个周期才能完成。 事实上,异或可能会因为必须从某个地方加载文字而受到惩罚,尽管我不确定这一点。 所以我认为这可能只是描述算法的一种首选方式,而不是优化......这是正确的吗? 编辑1: 因为我刚刚意识到crc变量的类型可能很重要,所以我在这里包含了整个代码(少了查找表,太大了),所以你不必点击链接。 uint32_t crc32(uint32_t crc, const void *buf, size_t size) { const uint8_t *p; p
  • 我如何猜测校验和算法?(How could I guess a checksum algorithm?)
    问题 假设我有一些数据包的末尾带有16位校验和。 我想猜测使用哪种校验和算法。 首先,从转储数据中,我可以看到数据包有效负载中的一个字节变化完全改变了校验和,因此我可以假定它不是某种简单的XOR或求和。 然后,我尝试了几种CRC16的变体,但运气不佳。 这个问题可能更偏向于密码学,但是我对任何易于理解的统计工具来找出这可能是CRC感兴趣。 如果其他所有方法都失败了,我什至可以转向绘制不同的CRC算法。 背景故事:我有带有某种校验和的串行RFID协议。 我可以毫无问题地重放消息,并解释结果(不进行校验和检查),但是由于设备将其丢在了地板上,所以我无法发送修改后的数据包。 使用现有软件,我可以更改RFID芯片的有效载荷。 但是,唯一的序列号是不可变的,因此我无法检查所有可能的组合。 尽管我可以生成递增1的值的转储,但不足以使详尽搜索适用于此问题。 如果问题本身还不够,则可以使用带有数据的转储文件:-) 需要参考文件吗? CRC错误检测算法的无忧指南是很好的参考,我在这里提出问题后就找到了。 最后,在给出了可接受的答案(比CCITT有用的提示)之后,我使用了此CRC计算器,并将生成的校验和与已知的校验和进行异或运算,得到0xffff,这使我得出结论:最终的xor是CCITT的0x0000的instread的0xffff。 回答1 CRC有很多变量需要考虑: Polynomial No
  • 根据 Javascript 中的字符串输入生成唯一编号(Generate unique number based on string input in Javascript)
    问题 过去,我制作了一个从字符串生成唯一 id(数字)的函数。 今天我发现它并不像应该的那样独特。 以前从未见过它的问题。 今天,两个不同的输入生成相同的 id(数字)。 我在 Delphi、C++、PHP 和 Javascript 中使用相同的技术来生成相同的 ID,因此当项目涉及不同的语言时没有区别。 例如,对于 HTML id、临时文件等,这可以方便地进行通信。 一般来说,我所做的是计算一个字符串的CRC16,相加并返回它。 例如,这两个字符串生成相同的 id(数字): o.uniqueId( 'M:/Mijn Muziek/Various Artists/Revs & ElBee - Tell It To My Heart.mp3' ); o.uniqueId( 'M:/Mijn Muziek/Various Artists/Dwight Yoakam - The Back Of Your Hand.Mp3'); 它们都生成 224904 的 ID。 以下示例是一个 javascript 示例。 我的问题是,我怎样才能避免(稍作改动)它会产生重复? (如果您可能想知道 'o.' 是什么意思,它是这些函数所属的对象): o.getCrc16 = function(s, bSumPos) { if(typeof s !== 'string' || s.length === 0)
  • Improve speed on Crc16 calculation
    I need to calculate Crc16 checksums with a $1021 polynom over large files, below is my current implementation but it's rather slow on large files (eg a 90 MB file takes about 9 seconds). So my question is how to improve my current implementation (to make it faster), I have googled and looked at some samples implementing a table lookup but my problem is that I don't understand how to modify them to include the polynom (probably my math is failing). { based on http://miscel.dk/MiscEl/CRCcalculations.html } function Crc16(const Buffer: PByte; const BufSize: Int64; const Polynom: WORD=$1021; const
  • C的确定性CRC(definitive CRC for C)
    问题 由于CRC的使用如此广泛,因此我很难在C中找到CRC实现感到惊讶。 是否有“所有人”使用的C的“确定的” CRC计算代码段/算法? 或者:有人可以担保并提出我一个好的CRC实施方案吗? 我特别在寻找CRC8和CRC16实现。 想到这一点,我的情况可能有点不合常规。 我正在为Linux编写C代码,并且该代码最终应移植到微控制器上。 似乎某些微控制器API确实与CRC实现一起提供。 无论如何,我都在寻找通用的软件实现(我读到CRC最初是由硬件实现的)。 回答1 不会。因为“ CRC”代表一组基于多项式的算法,所以没有“确定的CRC”。 通常会根据大小给出各种[模糊]通用名称(例如CRC-8,CRC-32)。 不幸的是,大多数尺寸都有几种不同的版本。 维基百科的“循环冗余校验”条目列出了一些常见的变体,但是必须使用给定域的正确校验和,否则会出现不兼容性。 (请参阅我对迈克答案的评论,以了解这有多令人困惑!) 无论如何,选择一个合适的实现并使用它-在网上可以找到很多示例。 如果碰巧有一个提供适当实现的库,则一定要使用它。 但是,没有为此的“标准” C库。 这里有一些资源: 在AutomationWiki上的“ CRC16”(CRC-16-CCITT)实现。 对Dobbs博士实施CCITT循环冗余检查。 Chris Borrelli撰写的IEEE 802
  • JavaScript CRC32(JavaScript CRC32)
    问题 我正在寻找CRC32的现代JavaScript实现。 此实现可能源自此处,现在位于此处,遍地,无处接受,因为它的速度很慢(500ms / MB),并且依赖于超过2KB的空间定界表,可以使用substr访问。 ! 似乎有一些CRC32的变体,因此我需要匹配以下输出: mysql> SELECT CRC32('abcde'); > 2240272485 函数实际上并不需要接受字符串,因为我正在使用字节数组。 回答1 更新 我添加了一个辅助函数来创建CRCTable,而不是在代码中包含大量字面量。 它也可以用于一次创建表并将其保存在对象或变量中,并用crc32函数使用该表(或作为W3C的示例,检查是否存在并在必要时创建)。 我还更新了jsPerf,以使用CRCtable与文字字符串,文字数组,保存的窗口变量和动态指针进行比较(此处显示的示例)。 var makeCRCTable = function(){ var c; var crcTable = []; for(var n =0; n < 256; n++){ c = n; for(var k =0; k < 8; k++){ c = ((c&1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1)); } crcTable[n] = c; } return crcTable; } var crc32
  • C语言查表法实现CRC-16计算
    文章目录 函数实现示例代码运行结果 函数实现 /* 16 bit CRC with polynomial x^16+x^12+x^5+1 */ uint16_t crc16_compute(const uint16_t initial_value,const uint8_t *data,const uint32_t data_length) { uint16_t crc = initial_value; uint32_t idx = 0; const uint16_t crc16_tab[256] = { 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b, 0x8528
  • CRC通用计算类
    /*前段时间在做项目中用到了CRC循环校验,在网上查了很多资料,但是都很零乱;本人作了相关整理,并对常用的循环冗余校验进行了封装,形成本文件。在这里感谢网络上提供相关资料的朋友们,关于他们的名字在这里我无法一一列举,再次向他们表示感谢!*/ /*以下代码的计算思想适用于所有CRC校验算法。64位以上的由于ulong已经无法表示了,所以没有实现。但是思想也是一样的。不过64位以上可以使用.net里面的别的hash:比如md5等算法.主要参考地址:[url]http://www.wiki.cn/wiki/Cyclic_redundancy_check[/url][url]http://www.zorc.breitbandkatze.de/crc.html[/url] [url]http://www.zorc.breitbandkatze.de/crctester.c[/url]*/ /*需要注意的是:即使都是同样位数的crc校验,多项式也可以不同。即使多项式相同,初值,末值xor,是否反转等设置也可以不同所以在通信的双方需要约定好。以下的具体crc子类只是我能找到的一些常用的crc约定。哪位兄弟有具体的crc约定,可以告知我进行扩展。*/ //* 采用了泛型定义基类,基类是一个通用的计算CRC的方法,定义具体的类时只需要设置好CRC设置即可。//* 本来想用c#写模版代码,可是C
  • CRC-CCITT 到 CRC16 Modbus 实现(CRC-CCITT to CRC16 Modbus implementation)
    问题 我在使用 PHP 生成 modbus CRC16 代码时遇到了很多麻烦。 我在互联网上找到了很多不同的代码,但我已经尝试过,但由于某种原因我没有得到正确的结果。 我找到了一个用于生成 CRC16-CCITT 的 PHP 代码。 我已将查找表更改为 modbus CRC 对应表,但结果仍然不正确。 代码如下。 我还需要做什么才能将 CRC16-CCITT 代码转换为 CRC16-MODBUS 代码。 <?php /************************************************************************* * phpCrc16 v1.1 -- CRC16/CCITT implementation * * By Matteo Beccati <matteo@beccati.com> * * Original code by: * Ashley Roll * Digital Nemesis Pty Ltd * www.digitalnemesis.com * ash@digitalnemesis.com * * Test Vector: "123456789" (character string, no quotes) * Generated CRC: 0x29B1 * *****************************
  • _mm_crc32_u64定义不正确(_mm_crc32_u64 poorly defined)
    问题 为什么在世界上_mm_crc32_u64(...)定义_mm_crc32_u64(...) ? unsigned int64 _mm_crc32_u64( unsigned __int64 crc, unsigned __int64 v ); “ crc32”指令始终累加一个32位CRC,而不是一个64位CRC(毕竟,它是CRC32而不是CRC64)。 如果机器指令CRC32恰好具有64位目标操作数,则高32位将被忽略,并在完成时用0填充,因此EVER具有64位目标没有用。 我了解为什么英特尔在指令上允许使用64位目标操作数(出于统一性),但是如果我想快速处理数据,我希望源操作数尽可能大(例如,如果我还有那么多数据,则为64位,尾部较小),并且始终为32位目标操作数。 但是内部函数不允许使用64位源和32位目标。 注意其他内在函数: unsigned int _mm_crc32_u8 ( unsigned int crc, unsigned char v ); “ crc”的类型不是8位类型,也不是返回类型,它们是32位。 为什么没有 unsigned int _mm_crc32_u64 ( unsigned int crc, unsigned __int64 v ); ? 英特尔指令支持这一点,这是最有意义的内在因素。 是否有人拥有可移植的代码(Visual
  • CRC-CCITT to CRC16 Modbus implementation
    I am having a lot of trouble on generating a modbus CRC16 code using PHP. I have found a lot of different codes over the internet but i have tried them and for some reason i didnt get right results. I have found a PHP code for generating CRC16-CCITT. I have chenge the look up table to the modbus CRC corresponding table but the result is still not the right one. The code is bellow. What do i need to do more in order to transform a CRC16-CCITT code into CRC16-MODBUS code. <?php /************************************************************************* * phpCrc16 v1.1 -- CRC16/CCITT
  • CRC(循环冗余校验)查表算法的代码实现
    CRC(循环冗余校验)查表算法的代码实现 前言准备工作查表算法的由来查表算法的基本原理模二减法(异或运算)的性质对直接计算法进行分析 基本原理的推广 查表算法的代码实现测试用例正式编码 代码的测试仓库地址 前言 CRC基本原理、数学描述和直接计算法的编程实现请参考笔者之前的劣文: https://blog.csdn.net/weixin_44256803/article/details/105805628 本文假设读者已有以上CRC基础 各种CRC类型汇总:https://reveng.sourceforge.io/crc-catalogue/ 准备工作 在正式进入查表算法的代码实现之前,需要先明白算法原理。 查表算法的由来 通过分析直接计算法的实现,很容易看出直接计算法中对于每一位数据都做了移位运算,遇到置1的位还会进行与多项式的模二减法(异或运算),这会大大降低算法的效率(时间复杂度过大): 能不能不要逐位计算,一次算好几位来提高速度呢? 查表算法的基本原理 模二减法(异或运算)的性质 在学习查表算法原理之前需要先了解模二减法(异或运算)的性质: 交换律:a ^ b = b ^ a 结合律:a ^ b ^ c = a ^ (b ^ c) 交换律很容易理解,结合律举例: 0110B ^ 0101B ^ 1001B = 1010B 0110B ^ (0101B ^ 1001B) =
  • 将 C CRC16 转换为 Java CRC16(Convert C CRC16 to Java CRC16)
    问题 我目前正在做一个项目,有一个嵌入式系统通过无线电向 PC 发送数据。 数据包最后得到一个 crc16 校验和,它是根据这个算法计算的: uint16_t crc16 (const uint8_t * buffer, uint32_t size) { uint16_t crc = 0xFFFF; if (buffer && size) while (size--) { crc = (crc >> 8) | (crc << 8); crc ^= *buffer++; crc ^= ((unsigned char) crc) >> 4; crc ^= crc << 12; crc ^= (crc & 0xFF) << 5; } return crc; } 现在我正在寻找 Java 中的等价物。 我已经在这里找到了一个很好的:http://introcs.cs.princeton.edu/java/51data/CRC16CCITT.java.html public class CRC16CCITT { public static void main(String[] args) { int crc = 0xFFFF; // initial value int polynomial = 0x1021; // 0001 0000 0010 0001 (0, 5, 12) // byte
  • 在软件中实现SSE 4.2的CRC32C(Implementing SSE 4.2's CRC32C in software)
    问题 所以我设计了一个包含CRC32C校验和的设计,以确保数据没有被损坏。 我决定使用CRC32C,因为如果运行该软件的计算机支持SSE 4.2,则我可以同时拥有软件版本和硬件加速版本 我要阅读英特尔的开发人员手册(第2A卷),该手册似乎提供了crc32指令后面的算法。 但是,我运气不好。 英特尔开发人员指南说: BIT_REFLECT32: DEST[31-0] = SRC[0-31] MOD2: Remainder from Polynomial division modulus 2 TEMP1[31-0] <- BIT_REFLECT(SRC[31-0]) TEMP2[31-0] <- BIT_REFLECT(DEST[31-0]) TEMP3[63-0] <- TEMP1[31-0] << 32 TEMP4[63-0] <- TEMP2[31-0] << 32 TEMP5[63-0] <- TEMP3[63-0] XOR TEMP4[63-0] TEMP6[31-0] <- TEMP5[63-0] MOD2 0x11EDC6F41 DEST[31-0] <- BIT_REFLECT(TEMP6[31-0]) 现在,据我所知,我已经正确地完成了从TEMP6开始的TEMP6 ,但是我认为我可能是误解了多项式除法,或者是错误地实现了它。 如果我的理解是正确的,则1 / 1 mod
  • 计算CRC16校验和的函数(Function to Calculate a CRC16 Checksum)
    问题 我正在开发一个库,以通过RS232或RS485连接提供简单可靠的通信。 此代码的一部分涉及对数据使用CRC16校验和,以检测线路噪声引起的损坏。 我创建了一个函数来计算CRC16校验和,但似乎未输出正确的值。 我编写的相关代码如下(也可以在此处找到)。 #include <stdint.h> #define CRC16 0x8005 uint16_t gen_crc16(const uint8_t *data, uint16_t size) { uint16_t out = 0; int bits_read = 0, bit_flag; /* Sanity check: */ if(data == NULL) return 0; while(size > 0) { bit_flag = out >> 15; /* Get next bit: */ out <<= 1; out |= (*data >> (7 - bits_read)) & 1; /* Increment bit counter: */ bits_read++; if(bits_read > 7) { bits_read = 0; data++; size--; } /* Cycle check: */ if(bit_flag) out ^= CRC16; } return out; }
  • CRC校验查表法原理及实现(CRC-16)
    绪论 在网上浏览了很多关于CRC校验的文章,基本上都是针对CRC校验原理的阐述以及关于CRC校验查表法的实际应用以及具体软件实现方法。 至于查的表是怎么来的,软件为什么要这样实现很多文章并没有说明。本篇文章就针对这两点问题进行总结和归纳,有错误的地方欢迎大家评论区指出,不胜感激。 注意:本篇文章不涉及CRC校验的基本原理,如果不了解CRC的基本原理,请移步至如下链接: CRC查找表法推导及代码实现比较 以下的CRC查表法的软件实现及推导过程均建立在modbusRTU协议使用的CRC-16标准。 查表法的表是怎么来的? CRC16算法的生成多项式 x 16 + x 15 + x 2 + 1 x^{16}+x^{15}+x^2+1 x16+x15+x2+1,十六进制表示为0x8005。 CRC16常见的表格中的数据是按照先传输LSB,消息右移进寄存器来计算的。因此需要判断寄存器的最低位LSB,同时要将0x8005按位颠倒后(0xA001)根据LSB的情况决定是否与寄存器异或即可。 CRC16的表格中对应的数依次为0~255计算出来的CRC值,因此,此处只选取其中一两个数作为实例计算CRC值。 具体步骤如下所示: 1)从0~255中选取需要计算的数,将其对应的十六进制数放入一个长度为16的寄存器的低八位,高八位填充0; 2)如果寄存器的末位LSB为1,将寄存器的数值右移1位
  • 使用 Java 将 BinHex 文件转换为普通文件 [关闭](Converting BinHex file to normal file using Java [closed])
    问题 这个问题不太可能对任何未来的访客有帮助; 它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,通常不适用于互联网的全球受众。 如需帮助使此问题更广泛地适用,请访问帮助中心。 8 年前关闭。 我有一个二进制文件。 应该使用java代码将此文件转换为普通可读文件。 我在这里发现了一个类似的问题, 使用java代码进行Binhex解码 但答案是行不通的。 我尝试过 Base64,该文件被转换为其他一些人类无法阅读的格式。 请帮我解决这个问题。 我试过的代码如下 File f = new File("Sample.pdf"); Base64 base64 = new Base64(); byte[] b = base64.decode(getBytesFromFile(f)); FileOutputStream fos = new FileOutputStream("Dcode.pdf"); fos.write(b); fos.close(); public static byte[] getBytesFromFile(File file) throws IOException { InputStream is = new FileInputStream(file); long length = file.length(); byte[] bytes = new