美文网首页
iOS 用Objective-C写CRC16位 MODBUS 校

iOS 用Objective-C写CRC16位 MODBUS 校

作者: 我是谁_你是谁 | 来源:发表于2021-04-07 10:14 被阅读0次

    网上找,没找到现成的好用的,github上倒是有一个工具类,不太会用

    所以找了个C语言写的,然后复合在OC代码里面

    实验结果正确,可以去测试,有在线测试的工具,请放心使用,分享给大家:

    下面涉及到的其他封装好的方法还有两个

    1. seperateStr: .....
    2. 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位就可以了

    相关文章

      网友评论

          本文标题:iOS 用Objective-C写CRC16位 MODBUS 校

          本文链接:https://www.haomeiwen.com/subject/uivykltx.html