| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 | ////  NSData+CRC16.m//  LipuWaterPurifier////  Created by leon on 2017/3/6.//  Copyright © 2017年 Lipu. All rights reserved.//#import "NSData+CRC16.h"#define CRC_16 0x8005@implementation NSData (CRC16)#define PLOY 0X1021uint16_t gen_crc16_ccitt(const uint8_t *data, uint16_t size) {    uint16_t crc = 0;    uint8_t i;    for (; size > 0; size--) {        crc = crc ^ (*data++ <<8);        for (i = 0; i < 8; i++) {            if (crc & 0X8000) {                crc = (crc << 1) ^ PLOY;            }else {                crc <<= 1;            }        }        crc &= 0XFFFF;    }    return crc;} uint16_t xmodem_crc16_ccitt(const uint8_t *pbBuf, uint32_t dwLen){    uint16_t wCRC = 0;    uint16_t  bCycle;        while (dwLen-- > 0)    {        wCRC ^= (unsigned short) *pbBuf++ << 8;        for (bCycle = 0; bCycle < 8; bCycle++)        {            if (wCRC & 0x8000)            {                wCRC = wCRC << 1 ^ 0x1021;            }            else            {                wCRC <<= 1;            }        }    }    return wCRC;}- (unsigned short)crc16Checksum2{    const uint8_t *bytes = (const uint8_t *)[self bytes];    uint16_t length = (uint16_t)[self length];        return (unsigned short)gen_crc16_ccitt(bytes, length);}- (unsigned short)crc16Checksum{    const uint8_t *bytes = (const uint8_t *)[self bytes];    uint16_t length = (uint16_t)[self length];    return (unsigned short)gen_crc16(bytes, length);}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 >> bits_read) & 1; // item a) work from the least significant bits                /* Increment bit counter: */        bits_read++;        if(bits_read > 7)        {            bits_read = 0;            data++;            size--;        }                /* Cycle check: */        if(bit_flag)            out ^= CRC_16;            }        // item b) "push out" the last 16 bits    int i;    for (i = 0; i < 16; ++i) {        bit_flag = out >> 15;        out <<= 1;        if(bit_flag)            out ^= CRC_16;    }        // item c) reverse the bits    uint16_t crc = 0;    i = 0x8000;    int j = 0x0001;    for (; i != 0; i >>=1, j <<= 1) {        if (i & out) crc |= j;    }        return crc;}//十六进制转ASCII- (NSString *)yx_bluetoothString {    Byte *byte = (Byte *)self.bytes;    NSMutableString *s = [NSMutableString new];    for (NSInteger i = 0; i < self.length; i++) {        [s appendFormat:@"%c",byte[i]];    }    return s;}@end
 |