您的位置:首页 > 移动开发 > Objective-C

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

2017-07-31 10:36 441 查看
参考安卓代码改编的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;
}








内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  objective-c CRC16