首页
学习
活动
专区
圈层
工具
发布

CRC16计算
EN

Stack Overflow用户
提问于 2016-05-30 20:36:46
回答 1查看 1.1K关注 0票数 0

有没有一种快速的方法来计算字符串上的CRC16,从这个表开始

代码语言:javascript
复制
NSArray* table16 = [NSArray arrayWithObjects:@0x0000, @0xC0C1, @0xC181, @0x0140, @0xC301, @0x03C0, @0x0280, @0xC241,@0xC601, @0x06C0, @0x0780, @0xC741, @0x0500, @0xC5C1, @0xC481, @0x0440,@0xCC01, @0x0CC0, @0x0D80, @0xCD41, @0x0F00, @0xCFC1, @0xCE81, @0x0E40,@0x0A00, @0xCAC1, @0xCB81, @0x0B40, @0xC901, @0x09C0, @0x0880, @0xC841,@0xD801, @0x18C0, @0x1980, @0xD941, @0x1B00, @0xDBC1, @0xDA81, @0x1A40,@0x1E00, @0xDEC1, @0xDF81, @0x1F40, @0xDD01, @0x1DC0, @0x1C80, @0xDC41,@0x1400, @0xD4C1, @0xD581, @0x1540, @0xD701, @0x17C0, @0x1680, @0xD641,@0xD201, @0x12C0, @0x1380, @0xD341, @0x1100, @0xD1C1, @0xD081, @0x1040,@0xF001, @0x30C0, @0x3180, @0xF141, @0x3300, @0xF3C1, @0xF281, @0x3240,@0x3600, @0xF6C1, @0xF781, @0x3740, @0xF501, @0x35C0, @0x3480, @0xF441,@0x3C00, @0xFCC1, @0xFD81, @0x3D40, @0xFF01, @0x3FC0, @0x3E80, @0xFE41,@0xFA01, @0x3AC0, @0x3B80, @0xFB41, @0x3900, @0xF9C1, @0xF881, @0x3840,@0x2800, @0xE8C1, @0xE981, @0x2940, @0xEB01, @0x2BC0, @0x2A80, @0xEA41,@0xEE01, @0x2EC0, @0x2F80, @0xEF41, @0x2D00, @0xEDC1, @0xEC81, @0x2C40,@0xE401, @0x24C0, @0x2580, @0xE541, @0x2700, @0xE7C1, @0xE681, @0x2640,@0x2200, @0xE2C1, @0xE381, @0x2340, @0xE101, @0x21C0, @0x2080, @0xE041,@0xA001, @0x60C0, @0x6180, @0xA141, @0x6300, @0xA3C1, @0xA281, @0x6240,@0x6600, @0xA6C1, @0xA781, @0x6740, @0xA501, @0x65C0, @0x6480, @0xA441,@0x6C00, @0xACC1, @0xAD81, @0x6D40, @0xAF01, @0x6FC0, @0x6E80, @0xAE41,@0xAA01, @0x6AC0, @0x6B80, @0xAB41, @0x6900, @0xA9C1, @0xA881, @0x6840,@0x7800, @0xB8C1, @0xB981, @0x7940, @0xBB01, @0x7BC0, @0x7A80, @0xBA41,@0xBE01, @0x7EC0, @0x7F80, @0xBF41, @0x7D00, @0xBDC1, @0xBC81, @0x7C40,@0xB401, @0x74C0, @0x7580, @0xB541, @0x7700, @0xB7C1, @0xB681, @0x7640,@0x7200, @0xB2C1, @0xB381, @0x7340, @0xB101, @0x71C0, @0x7080, @0xB041,@0x5000, @0x90C1, @0x9181, @0x5140, @0x9301, @0x53C0, @0x5280, @0x9241,@0x9601, @0x56C0, @0x5780, @0x9741, @0x5500, @0x95C1, @0x9481, @0x5440,@0x9C01, @0x5CC0, @0x5D80, @0x9D41, @0x5F00, @0x9FC1, @0x9E81, @0x5E40,@0x5A00, @0x9AC1, @0x9B81, @0x5B40, @0x9901, @0x59C0, @0x5880, @0x9841,@0x8801, @0x48C0, @0x4980, @0x8941, @0x4B00, @0x8BC1, @0x8A81, @0x4A40,@0x4E00, @0x8EC1, @0x8F81, @0x4F40, @0x8D01, @0x4DC0, @0x4C80, @0x8C41,@0x4400, @0x84C1, @0x8581, @0x4540, @0x8701, @0x47C0, @0x4680, @0x8641,@0x8201, @0x42C0, @0x4380, @0x8341, @0x4100, @0x81C1, @0x8081, @0x4040,nil];

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2016-05-30 22:07:30

这是一个使用所反映的多项式0x8005一次计算一个字节的16位CRC的表。完成该图还需要两条信息,即初始CRC寄存器内容和最终CRC异或结果。

在此list of 16-bit CRCs中,有四个可能使用该表的CRC定义:

代码语言:javascript
复制
width=16 poly=0x8005 init=0x0000 refin=true refout=true xorout=0x0000 check=0xbb3d name="ARC"
width=16 poly=0x8005 init=0x0000 refin=true refout=true xorout=0xffff check=0x44c2 name="CRC-16/MAXIM"
width=16 poly=0x8005 init=0xffff refin=true refout=true xorout=0xffff check=0xb4c8 name="CRC-16/USB"
width=16 poly=0x8005 init=0xffff refin=true refout=true xorout=0x0000 check=0x4b37 name="MODBUS"

您将注意到,所有对象都具有相同的多边形,并且都是refin和refout true (反射),但它们具有不同的init和xorout值。您要查找的CRC可能是其中之一,也可能是不在表中的其他CRC。

要使用该表计算CRC,您可以使用如下代码(在C中):

代码语言:javascript
复制
crc = init;
while (len--)
    crc = (crc >> 8) ^ table[(crc ^ *data++) & 0xff];
crc ^= xorout;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37525856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档