精华内容
下载资源
问答
  • CRC8查表法
    千次阅读
    2021-02-05 13:52:45

    /*****************************************************

    描    述:  CRC8校验子程序 x^8+x^5+x^4+x^0

    入口参数:  指向数组指针,校验字节个数

    出口参数:  8位CRC校验码

    ******************************************************/

    const char CRC8Table[]={

    0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65,

    157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220,

    35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98,

    190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255,

    70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7,

    219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154,

    101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36,

    248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185,

    140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205,

    17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80,

    175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238,

    50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115,

    202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139,

    87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22,

    233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168,

    116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53

    };

    unsigned char CRC8_Table(unsigned char *p, char counter)

    {

    unsigned char crc8 = 0;

    for( ; counter > 0; counter--){

    crc8 = CRC8Table[crc8^*p];

    p++;

    }

    return(crc8);

    }

    /*****************************************************

    描    述:  text

    ******************************************************/

    void main()

    {

    unsigned  char  a[] = {0x02, 0x03};

    printf("%d", CRC8_Table(&a, 2));

    getch();

    }

    更多相关内容
  • 查表法计算CRC

    2020-12-24 02:03:29
    (查表法)CRC检验码的计算过程(1)将上次计算出的CRC校验码右移一个字节;(2)将移出的这个字节与新的要校验的字节进行XOR 运算;(3)用运算出的值在预先生成码表中进行索引,获取对应的值(称为余式);(4)用获取的值与第...

    (查表法)CRC检验码的计算过程

    (1)将上次计算出的CRC校验码右移一个字节;

    (2)将移出的这个字节与新的要校验的字节进行XOR 运算;

    (3)用运算出的值在预先生成码表中进行索引,获取对应的值(称为余式);

    (4)用获取的值与第(1)步右移后的值进行XOR 运算;

    (5)如果要校验的数据已经处理完,则第(4)步的结果就是最终的CRC校验码。如果还有数据 要进行处理,则再转到第(1)步运行。

    public static byte GetCRC8(byte[] data, int startIndex, int dataLength)

    {

    if (data == null)

    throw new ArgumentNullException("数组不能为空");

    if (startIndex > data.Length)

    throw new ArgumentException("起始索引超出数组长度");

    if (startIndex < 0)

    throw new ArgumentOutOfRangeException("起始索引不应该小于0");

    byte result = 0;

    for (int i = 0; i < dataLength; i++)

    {

    result = CRC8_TABLE[(byte)result ^ data[startIndex + i]];

    }

    return result;

    }

    public static byte GetCRC16(byte[] data, int startIndex, int dataLength)

    {

    if (data == null)

    throw new ArgumentNullException("数组不能为空");

    if (startIndex > data.Length)

    throw new ArgumentException("起始索引超出数组长度");

    if (startIndex < 0)

    throw new ArgumentOutOfRangeException("起始索引不应该小于0");

    UInt16 result = 0;

    for (int i = 0; i < dataLength; i++)

    {

    result = (UInt16)(((result >> 8)) ^ CRC16_TABLE[(byte)(data[startIndex + i] ^ result)]);

    }

    return result;

    }

    #region CRC表

    ///

    /// 8位CRC表

    ///

    static readonly byte[] CRC8_TABLE = new byte[]

    {

    0x00, 0x07, 0x0E, 0x09, 0x1C, 0x1B, 0x12, 0x15,

    0x38, 0x3F, 0x36, 0x31, 0x24, 0x23, 0x2A, 0x2D,

    0x70, 0x77, 0x7E, 0x79, 0x6C, 0x6B, 0x62, 0x65,

    0x48, 0x4F, 0x46, 0x41, 0x54, 0x53, 0x5A, 0x5D,

    0xE0, 0xE7, 0xEE, 0xE9, 0xFC, 0xFB, 0xF2, 0xF5,

    0xD8, 0xDF, 0xD6, 0xD1, 0xC4, 0xC3, 0xCA, 0xCD,

    0x90, 0x97, 0x9E, 0x99, 0x8C, 0x8B, 0x82, 0x85,

    0xA8, 0xAF, 0xA6, 0xA1, 0xB4, 0xB3, 0xBA, 0xBD,

    0xC7, 0xC0, 0xC9, 0xCE, 0xDB, 0xDC, 0xD5, 0xD2,

    0xFF, 0xF8, 0xF1, 0xF6, 0xE3, 0xE4, 0xED, 0xEA,

    0xB7, 0xB0, 0xB9, 0xBE, 0xAB, 0xAC, 0xA5, 0xA2,

    0x8F, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9D, 0x9A,

    0x27, 0x20, 0x29, 0x2E, 0x3B, 0x3C, 0x35, 0x32,

    0x1F, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0D, 0x0A,

    0x57, 0x50, 0x59, 0x5E, 0x4B, 0x4C, 0x45, 0x42,

    0x6F, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7D, 0x7A,

    0x89, 0x8E, 0x87, 0x80, 0x95, 0x92, 0x9B, 0x9C,

    0xB1, 0xB6, 0xBF, 0xB8, 0xAD, 0xAA, 0xA3, 0xA4,

    0xF9, 0xFE, 0xF7, 0xF0, 0xE5, 0xE2, 0xEB, 0xEC,

    0xC1, 0xC6, 0xCF, 0xC8, 0xDD, 0xDA, 0xD3, 0xD4,

    0x69, 0x6E, 0x67, 0x60, 0x75, 0x72, 0x7B, 0x7C,

    0x51, 0x56, 0x5F, 0x58, 0x4D, 0x4A, 0x43, 0x44,

    0x19, 0x1E, 0x17, 0x10, 0x05, 0x02, 0x0B, 0x0C,

    0x21, 0x26, 0x2F, 0x28, 0x3D, 0x3A, 0x33, 0x34,

    0x4E, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5C, 0x5B,

    0x76, 0x71, 0x78, 0x7F, 0x6A, 0x6D, 0x64, 0x63,

    0x3E, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2C, 0x2B,

    0x06, 0x01, 0x08, 0x0F, 0x1A, 0x1D, 0x14, 0x13,

    0xAE, 0xA9, 0xA0, 0xA7, 0xB2, 0xB5, 0xBC, 0xBB,

    0x96, 0x91, 0x98, 0x9F, 0x8A, 0x8D, 0x84, 0x83,

    0xDE, 0xD9, 0xD0, 0xD7, 0xC2, 0xC5, 0xCC, 0xCB,

    0xE6, 0xE1, 0xE8, 0xEF, 0xFA, 0xFD, 0xF4, 0xF3

    };

    static readonly ushort[] CRC16_TABLE = new ushort[]

    {

    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, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,

    0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4,

    0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,

    0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,

    0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,

    0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12,

    0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,

    0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41,

    0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,

    0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,

    0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,

    0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,

    0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,

    0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,

    0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,

    0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,

    0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,

    0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C,

    0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,

    0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB,

    0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,

    0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,

    0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,

    0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9,

    0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,

    0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,

    0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0

    };

    #endregion

    展开全文
  • CRC32查表法

    2021-01-14 04:42:39
    1 static const u_int32 CRC32_Table[256] =2 {3 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,4 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,5 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,...

    1 static const u_int32 CRC32_Table[256] =

    2 {3 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,4 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,5 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,6 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,7 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE,8 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,9 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC,10 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,11 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,12 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,13 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940,14 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,15 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116,16 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,17 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,18 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,19 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A,20 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,21 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818,22 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,23 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,24 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,25 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C,26 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,27 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2,28 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,29 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,30 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,31 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086,32 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,33 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4,34 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,35 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,36 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,37 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8,38 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,39 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE,40 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,41 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,42 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,43 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252,44 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,45 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60,46 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,47 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,48 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,49 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04,50 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,51 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A,52 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,53 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,54 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,55 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E,56 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,57 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C,58 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,59 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,60 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,61 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0,62 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,63 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6,64 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,65 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,66 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D

    67 };

    展开全文
  • 请教查表法计算CRC的原理

    千次阅读 2021-01-14 04:42:45
    自己写过的,希望对你有帮助CyclicRedundancyCheck(CRC)原理及实现///////////////////////////////////////////////////////////////////////////1:需求在数据传送过程中,为了能够进行错误检测,往往在数据后追加...

    自己写过的, 希望对你有帮助

    Cyclic Redundancy Check(CRC) 原理及实现

    ///

    1: 需求

    在数据传送过程中,为了能够进行错误检测, 往往在数据后追加一些检测码,

    当接受方收到了数据后, 用同样的算法进行计算检测码, 如果一致说明数据

    正确, 否则通知发送方重新发送。 现假定数据为6 23 44:

    历史上出现过多个算法, 如:

    累加求模:

    (6+23+4)%256 == 33, 则发送数据6 23 44 33

    XOR:

    (6^ 23 ^4) = 21 则发送数据 6 23 4 21

    然而, 这却不是好的算法, 好的算法要求数据的数据能散列的分布在检测码

    中, 对于累加求模的(6 24 3 )以及xor的(6 22 5)都能输出同样的检测码

    于是, CRC诞生了。

    ///

    ///

    2:CRC的背景理论

    crc将数据追加结尾的wbit的0当作一个很大阶的多项式, 用它去除于另一个双方约定的多项式,

    得到的余数, 则为检测码,其中w为约定多项式的最大阶数, 最后传输原始数据追加检测码,

    其中任何一位发生变化, 都导致最后得到的结果差别很大,

    CRC因为容易简单实现以及容错性强, 而被广泛使用。

    追加wbit的好处是, 整个传输的数据刚刚能够被约定的多项式

    p1|00..00| / p2 = p3 .....p4

    则(p1|00.00|+p4) / p2 = p3....0

    p1|00.00|+p4 = p1|p4|  (后面的多项式运算能够证明)

    这里为了方便说明, 下列进行运行的数据都没有追加结尾的0

    这里有2个问题, 如何把数据流转换成多项式, 以及如何做多项式的除法。

    数据流的转换:

    假如有2个byte(6,23)我们把他转成16进制为0617, 二进制表示为

    0000 0110 0001 0111 对应多项式 x^10 + x^9 + x^4 + x^2 + x^1 + 1

    多项式除法:

    先说多项式加法, 多项式x^4 + x^2 + x + 1 和多项式x^4+x^3+1

    为 2*x^4 + x^3 + x^2 + x^1 + 2*(x^0)

    由于x是个未知数, 不知道怎么进行系数和阶的转换, 于是规定:

    "如果系数mod2==0, 那么则丢弃, 否则保留, 多项式不考虑系数"

    所以上述2个多项式相加的结果为 x^3+x^2+x^1

    同样根据规定可以知道, 多项式p1+p2 == p1-p2,

    即: 多项式相减等同于多项式相加.

    用2进制表示有 1011 + 1101 = 0110, 1011 - 1101 = 0110

    这即等同与2进制的xor操作。

    再来看看多项式乘法, (x^4+x^2+x^1+1) * (x^2 + x^1 + 1)

    = (x^6+x^4+x^3+x^2) + (x^5+x^3+x^2+x^1) + (x^4+x^2+x^1+1)

    = x^6 + x^5 + x^2 + 1

    我们再来看看多项式除法

    x^2 + x1 + 1

    --------------------

    x^4+x^2+x^1+1 ) x^6 + x^5 + x^2 + 1

    (x^6+x^4+x^3+x^2) + (x^5+x^3+x^2+x^1) + (x^4+x^2+x^1+1)

    -(x^6 + x^4 + x^3 + x^2)

    (x^5+x^3+x^2+x^1) + (x^4+x^2+x^1+1)

    -(x^5+x^3+x^2+x^1)

    (x^4+x^2+x^1+1)

    -(x^4+x^2+x^1+1)

    0

    根据乘/除法和加/减法的运算规则不难看出,

    a: p1 % p2 = p3....p4 ===> p1 = p2*p3 + p4

    b: 设p2是一个w阶的多项式, 那么余数是一个w-1阶的多项式。 w叫做多项式的位宽。

    比如 x^4+x^2+x^1+1的位宽为4, 余数为一个3阶的多项式。 占4个2进制位.

    crc中, 把w位宽的多项式叫做crcw, 如约定的除式为X^4+x^2+x^1+1 (10111)

    那么就叫crc4, 对于的余数则在(0000 ... 1111)的范围内.

    ///

    ///

    3: 实现

    对于2中定义的多项式. 转成2进制的形式, 有

    111

    -------------------

    10111 (b)   )1100101                   (a)

    10111..

    11100.

    10111.

    10111

    10111

    0

    不难看出, 设4bit的crc初始为0, 每次从crc中移走最高位, 从a中移走一位进最

    低位,  如果crc中移走的为1, 则将结果xor下10111的低4位(0111), 否则不处理

    c语言描述有

    while (msg)

    {

    crc = (crc<<1 | get_msg_bit) ^  ( (crc&1000) ? (10111&1111) : 0000)

    }

    for(int i=0; i

    {

    crc = (crc<<1 | 0) ^  ( (crc&1000) ? (10111&1111) : 0000)

    }

    上述即是crc的标准算法. 下面我们开始优化.

    ----------------------------------------

    优化a: 查表法

    设a,b,c都是4bit的数, 有

    (a^b) ^ c == a ^ (b^c)

    证明: 因为xor都是位对其操作, 所以我们只要证明bit具有属性(b1^b2)^b3==b1^(b2^b3)

    因 (b1^b2)^b3 == ((b1+b2)+b3)mod2,   b1^(b2^b3) == (b1+(b2+b3))mod2

    bit operator + 具有交换率,  所以 (a^b)^c == a^(b^c)

    因为计算机的操作单元一般都是byte, 如果每次都进行一次bit操作, 那么效率上

    会大打折扣.

    现在我们假设w是32, 即crc32. 有个4byte的寄存器R [b1 b2 b3 b4] 用来存储CRC32的值

    根据前面的交换率, 我们可以先计算出b1对于后4个字节的影响值来, 记做table[b1]

    然后把b2 b3 b4 a (a为读出的一个byte的msg) 跟 table[b1]来xor下. 有

    while(msg)

    {

    crc =     (crc<<8 | get_msg_byte) ^  table[crc >> 24];

    }

    for(int i=0; i

    {

    crc =     (crc<<8 | 0) ^ table[crc>>24];

    }

    前提是要提前计算出一个静态的256项的表来, 当然你也可以计算出65536项的表来, 一次

    update 2个byte, 但这样意义不大.

    ----------------------------------------

    优化b:  我们现在开始把后面烦琐的 for(int i=0; i

    假如数据 aa bb cc dd .. xx 00 00 00 00 有crc32为 (a1 a2 a3 a4)         .....(1)

    数据 aa bb cc dd .. xx yy 00 00 00 00 有crc32为(b1 b2 b3 b4)       .....(2)

    数据 aa bb cc dd .. xx yy 00 00 00 有crc32(c1 c2 c3 c4)            .....(3)

    不难看出, c1=a1^yy c2=a2 c3=a3 c4=a4,  这是因为yy处于最后w位移进R的, 他不会被R

    移出左边, 所以他不会影响到后面3个0. 他只会被前面的值xor影响到, 由于xor具有

    交换率, 所以c1=a1^yy, 现在..

    aa bb cc dd .. xx yy 00 00 00 有crc32(a1^yy a2 a3 a4)         .....(3)

    aa bb cc dd .. xx yy 00 00 00 00 有crc32(b1 b2 b3 b4)         .....(2)

    根据a的查表, 我们可以知道

    (b1 b2 b3 b4)  ==     table[a1^yy] ^ (a2 a3 a4 00)

    回到刚开始, crc32 init == (x1 x2 x3 x4),  那么 x1 x2 x3 x4 00 00 00 00 = (y1 y2 y3 y4)

    现在init=0, 所以x1x2x3x4y1y2y3y4 = 0

    有 aa 00 00 00 00 为 table[aa], 也就是 table[aa^0] ^ (0)

    综合有.

    crc = 0

    while(msg)

    {

    crc  = table[crc>>24 ^ get_msg_byte] ^ (crc<<8)

    }

    -------------------------------------------

    优化c : Reflected

    由于我们用字节存储的时候, 都是LSBF(least significant bit first)

    而我们b里面是用的MSBF,  也就是说, 在算法b中, 我们需要:

    把每次get_msg_byte都需要Reflected

    initial value需要reflected

    最后的结果需要reflected下

    byte reflected(byte b)

    {

    byte c;

    for(int i=0; i<8; ++i)

    {

    c <<= 1;

    if (b&1) c|=1;

    b >>= 1;

    }

    return c;

    }

    于是有

    while(msg)

    {

    crc = table[crc ^ get_msg_byte] ^ (crc>>8)

    }

    注意这里的table, 是用reflected的多项式生成的.

    initial value也是reflected的. 为了get_msg_byte不需要reflect, 那么

    table中, index也是被reflected了.

    ///

    ///

    4: 可变参数

    我们知道了, CRC算法受到下列形态的影响

    * 多项式的w, 以及多项式

    * initial value

    * 做处理的时候是 MSBF还是LSBF

    * final register

    (同initial value, 为了区分不同的crc, 当同一个消息时,

    所以定义了最后的xor final register)

    下面给出一种模型.

    Rocksoft^tm Model CRC Algorithm

    Name, Width, Poly, Init, Refin, Refout

    下列是一份常用的CRC列表

    X25   standard : 1021       [CRC-CCITT, ADCCP, SDLC/HDLC]

    X25   reversed : 0811

    CRC16 standard : 8005

    CRC16 reversed : 4003       [LHA]

    Name   : "CRC-16"

    Width  : 16

    Poly   : 8005

    Init   : 0000

    RefIn  : True

    RefOut : True

    XorOut : 0000

    Check  : BB3D

    Name   : "CRC-16/CITT"

    Width  : 16

    Poly   : 1021

    Init   : FFFF

    RefIn  : False

    RefOut : False

    XorOut : 0000

    Name   : "XMODEM"

    Width  : 16

    Poly   : 8408

    Init   : 0000

    RefIn  : True

    RefOut : True

    XorOut : 0000

    Name   : "ARC"

    Width  : 16

    Poly   : 8005

    Init   : 0000

    RefIn  : True

    RefOut : True

    XorOut : 0000

    Name   : "CRC-32"

    Width  : 32

    Poly   : 04C11DB7        [PKZIP, AUTODIN II, Ethernet, FDDI]

    Init   : FFFFFFFF

    RefIn  : True

    RefOut : True

    XorOut : FFFFFFFF

    Check  : CBF43926

    ///

    展开全文
  • CRC查表算法(C)

    2021-01-14 04:42:43
    //CRC查表法//索引CRC的方式比对报文缓存区的每个新字符都计算新的CRC值得方法更快捷。//声明两个参数//unsigned char *puchMsg; //含有生成CRC所使用的二进制数据的报文缓存区指针。//unsigned short usDataLen; //...
  • CRC32 查表法 java

    2020-12-24 02:03:36
    public static int Calc(byte[] content){int crc32 = 0xffffffff;for(int i=0;icrc32 = (crc32<<8)^TABLE[(reverse(content[i],8)^(crc32>>24))&0xFF];}return reverse(crc32^0xffffffff,32);}priv...
  • crc8查表法校验程序和校验检查软件

    热门讨论 2012-08-03 20:25:07
    CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。 CRC校验可以简单地描述为:例如我们要发送一些数据(信息字段),...
  • 循环冗余校验码(CRC),简称循环码,是一种常用的、具有检错、纠错能力 的校验码,在通信中运用广泛。 CRC 计算可以靠专用的硬件来实现,但是对于低 成本的微控制器系统,在没有硬件支持下实现 CRC 检验,关键的...
  • CRC算法 个人学习笔记 直接法、查表法注意点

    万次阅读 多人点赞 2017-12-09 17:00:09
    1、CRC算法会根据选择生成的检验码的长度,需要设置一个生成多项式,一般会使用国际上几个大厂或者行业内的常用的标准多项式,而且这些标准还有其他选项细微的差别, 比如初始值的设置、是从数据的MSB/LSB开始计算、...
  • CRC-16 校验码计算方法: 常用查表法和计算法。计算方法一般都是: ( 1 )、预置 1 个 16 位的寄存器为十六进制 FFFF (即全为 1 ),称此寄存器为 CRC 寄存 器; ( 2 )、把第一个 8 位二进制数据(既通讯信息帧...
  • CRC8的查表法实现!

    2020-12-24 02:05:14
    unsigned char CRC8(unsigned char *puchMsg, unsigned short usDataLen, int zflj, BOOL reverse) { if(zflj>=2)return puchMsg[5]; unsigned char uchCRC=0xff; unsigned uIndex; uIndex=*puchMsg; puchMsg++; ...
  • 用go仿写了一个CRC16校验方法var (aucCRCHi = []byte{0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,0x00, 0...
  • CRC16是单片机程序中常用的一种校验算法。依据所采用多项式的不同,得到的结果也不相同。...闲言少叙,下面是查表法计算CRC16的代码:/*****************************************************************...
  • 本文分为两部分,前者讲述了相关的CRC常用算法与CRC的计算思想;后者阐述了一种可以计算出相关的CRC计算表的方式以及一种实现的例子。 阅读本文,您可能需要掌握的知识: 技能 熟练度 英语 熟练 知识...
  • CRC16为通讯领域常用的校验算法,其原理想必大家都很清楚。下面为相关的总结和封装类代码。 Unicode环境下要将Cstring转换为Char*字符串要对字符串的宽度进行转换,转换方法主要用到WideCharToMultiByte()函数...
  • CRC校验原理及查表码表由来

    万次阅读 2017-01-19 13:40:46
    为了缩短计算时间,CRC校验又分为直接计算查表计算。 直接计算是一种按位计算方法,其计算原理如下: 假定有待校验数据A = 1101,校验多项式B = 0000 0111,当前CRC校验值 CRC = 1011 1001, 期待结果C。则...
  • 用表驱动来实现CRC8、CRC16、CRC32的数据校验,程序简洁,通俗易懂
  • 本文主要介绍,我们在应用串口WiFi中遇到的通讯错误等问题的解决方法。以SimpleWiFi的S2W-M02为例,通过源码的方式介绍CRC8的查表方法。
  • 在数据传输过程中,怎样保证接收端接收到的数据就是发送端发送的,如果发送端发送的数据在发送过程中收到干扰,某个比特位反转了,接收端接收到数据后怎样确认这帧数据是错误的,这就需要使用CRC校验算法了,首先...
  • 本文基于Atmega128高速嵌入式单片机,实现32位CRC校验码的直接生成查表生成;根据实验结果,分析两种方法的特点。 关键词:Atmega128 CRC校验码 CRC生成表 数据段引 言 随着技术的不断进步,各种数据通信的...
  • 本文基于Atmega128高速嵌入式单片机,实现32位CRC校验码的直接生成查表生成;根据实验结果,分析两种方法的特点。关键词:Atmega128CRC校验码CRC生成表数据段引言: 随着技术的不断进步,各种数据通信的应用...
  • c 实现crc16查表校验

    2021-08-16 15:31:50
    CRC即循环冗余校验码是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。 基本原理 任意一个由二进制位串组成的代码都可以和一个系数仅为0和1取值的多项式一一对应。例如...
  • 常用CRC16计算函数,包括计算法和查表法。内容包括CRC16_CCITT/CRC16_CCITT_FALSE/CRC16_XMODEM/CRC16_X25/ CRC16_MODBUS/CRC16_IBM/CRC16_MAXIM/CRC16_USB/CRC16_DNP
  • 关于stm32的硬件CRC的一些问题

    千次阅读 2020-10-23 17:19:16
    以前知道stm32存在硬件CRC32校验,...2.使用的CRC校验为CRC-32/MPEG-2.(与常用CRC32校验区别就是,校验后的返回的校验 异或了一下) 所以根据以上的区别,我们在原来的校验方式稍微修改一点就可以与是stm32的硬件crc
  • 常用crc16算法的几种最基本的方式

    千次阅读 2021-02-24 10:19:42
    方法1选用了一种常见的查表方法,类似的还有512字节、256字等查找表的,至于查找表的生成,这里也略过。 #include "user_crc.h" //#include "stdafx.h" const uint16_t polynom = 0xA001; uint16_t crc16...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 863
精华内容 345
关键字:

常用crc查表法

友情链接: labview-control.rar