网上找,没找到现成的好用的,github上倒是有一个工具类,不太会用
所以找了个C语言写的,然后复合在OC代码里面
实验结果正确,可以去测试,有在线测试的工具,请放心使用,分享给大家:
下面涉及到的其他封装好的方法还有两个
- seperateStr: .....
- decimalString ......
放到最下面了
!!!还有一定要看最下面的 注 !!!
// CRC16-MODBUS校验
// 举个栗子 010300010008 命令
- (NSString *)getCrc16_MODBUSWithString:(NSString *)str{
NSArray *array = [[NSArray alloc]initWithArray:[self seperateStr:str byLength:2]];
unsigned short tmp = 0xffff;
unsigned short ret1 = 0;
Byte buff[10240] = {};
for (int i = 0; i < array.count; i++) {
buff[i] = [[self decimalStringFromHexString:array[i]] intValue];// 这个是16进制转换成10进制
}
for(int n = 0; n < array.count; n++){
tmp = buff[n] ^ tmp;
for(int i = 0;i < 8;i++){ /*此处的8 -- 指每一个char类型又8bit,每bit都要处理*/
if(tmp & 0x01){
tmp = tmp >> 1;
tmp = tmp ^ 0xa001;
}
else{
tmp = tmp >> 1;
}
}
}
/*CRC校验后的值*/
printf("校验后的值%X\n",tmp);
/*将CRC校验的高低位对换位置*/
ret1 = tmp >> 8;
ret1 = ret1 | (tmp << 8);
printf("高低位对换后的值ret: %X\n",ret1);
NSString *returnStr = [NSString stringWithFormat:@"%X",ret1];
return returnStr;
}
额外封装方法1:
- (NSMutableArray *)seperateStr:(NSString *)str byLength:(int)length{
//举例 828384 以 2个 为单位 拆分
NSMutableArray *returnArray = [[NSMutableArray alloc] init];
for (int i = 0; i < (str.length - length) + 1; i=i+length) {
NSString *twoStr = [str substringWithRange:NSMakeRange(i, length)];
[returnArray addObject:twoStr];
}
return returnArray;
}
方法2:
- (NSString *)decimalStringFromHexString:(NSString *)string{
NSString * decimalStr = [NSString stringWithFormat:@"%lu",strtoul([string UTF8String],0,16)];
return decimalStr;
}
Tips: 这几个方法都可以放在工具类里面 用工具类 调用 (把实例方法改成类方法就可以)
感谢,那个用c语言写出来的人。
附上他的链接:https://blog.csdn.net/u013625451/article/details/81239572
!!!注:有的时候 反的是 3位的 ,如果是3位就前面加个0凑4位就可以了