参照安卓计算CRC16校验码的方法获取Objective-C的CRC16位校验码

参考安卓代码改编的CRC16位校验码生成方法,不一定对所有项目适用。

安卓代码请参考:http://blog.csdn.net/Jhear/article/details/51840269?locationNum=1&fps=1#objc#



Objective-C代码如下:

- (NSString *)getCRC16:(NSString *)source {
    int crc = 0xA1EC;            // 初始值
    int polynomial = 0x1021;     // 校验公式 0001 0000 0010 0001
    NSArray *bytess = [self getByteForString:source]; //提取十六进制字符串数组
    
    for (NSString *b in bytess) {
        for (int i = 0; i < 8; i++) {
            int a = (int)[b mln_hexStringToInteger]; //转化为int才可以按位与 或 转化普通字符串位16进制数的类方法
            Boolean bit = ((a >> (7 - i) & 1) == 1);
            Boolean c15 = ((crc >> 15 & 1) == 1);
            crc <<= 1;
            if (c15 ^ bit)
                crc ^= polynomial;
        }
    }
    crc &= 0xffff;
    NSString *result = [NSString stringWithFormat:@"%x",crc]; //转化运算结果为16进制字符串
    while (result.length < 4) {         //CRC检验一般为4位,不足4位补0
        result = [@"0" stringByAppendingString:result];
    }
    return result;
}
- (NSArray *)getByteForString:(NSString *)string {
    NSMutableArray *strArr = [NSMutableArray array];
    
    for (int i = 0; i < string.length/2; i++) {
        NSString *str = [string substringWithRange:NSMakeRange(i * 2, 2)];
        [strArr addObject:str];
    }
    return [strArr copy];
}


转化普通字符串位16进制数的类方法,代码片段如下(资料来自网上):

//将16进制的字符串转化为10进制
- (NSInteger)mln_hexStringToInteger {
    
    NSInteger sum = 0;
    
    for (NSInteger i = 0; i < self.length ; i++) {
        NSString *subString = [self substringWithRange:NSMakeRange(self.length - i - 1, 1)];
        
        if (i == 0) {
            if ([subString.lowercaseString isEqualToString:@"f"]) {
                sum += 15;
            } else if ([subString.lowercaseString isEqualToString:@"e"]) {
                sum += 14;
            } else if ([subString.lowercaseString isEqualToString:@"d"]) {
                sum += 13;
            } else if ([subString.lowercaseString isEqualToString:@"c"]) {
                sum += 12;
            } else if ([subString.lowercaseString isEqualToString:@"b"]) {
                sum += 11;
            } else if ([subString.lowercaseString isEqualToString:@"a"]) {
                sum += 10;
            } else {
                sum += [subString integerValue];
            }
        } else {
            if ([subString.lowercaseString isEqualToString:@"f"]) {
                sum += 15 * (16 * i);
            } else if ([subString.lowercaseString isEqualToString:@"e"]) {
                sum += 14 * (16 * i);
            } else if ([subString.lowercaseString isEqualToString:@"d"]) {
                sum += 13 * (16 * i);
            } else if ([subString.lowercaseString isEqualToString:@"c"]) {
                sum += 12 * (16 * i);
            } else if ([subString.lowercaseString isEqualToString:@"b"]) {
                sum += 11 * (16 * i);
            } else if ([subString.lowercaseString isEqualToString:@"a"]) {
                sum += 10 * (16 * i);
            } else {
                sum += [subString integerValue] * (16 * i);
            }
        }
    }
    
    return sum;
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值