参照安卓计算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;
}
安卓代码请参考: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;
}
相关文章推荐
- crc 校验码的计算方法 (转载)
- CRC 循环冗余校验码 的计算方法
- 组织机构中校验码的计算方法
- 安卓里获取默认应用方法
- c/c++在windows下获取时间和计算时间差的几种方法总结
- 校验码的计算方法说明
- js javascript 获取各种时间计算方法
- CRC计算方法与C实现
- 安卓开发之全局获取Context的方法
- PHP安装GeoIP扩展根据IP获取地理位置及计算距离的方法
- PHP文件操作之获取目录下文件与计算相对路径的方法
- 安卓代码中获取dimen设置字体大小setTextSize,会变得比dimen的值还大——解决方法
- 安卓里获取默认应用方法
- 18位身份证号码最后一位校验码的计算方法
- android获取、计算文件夹和文件大小的方法
- C++获取当前时间和计算程序运行时间的方法
- C++获取当前时间和计算程序运行时间的方法
- c/c++获取时间和计算时间差的几种方法总结
- android安卓onCreate方法中获取控件宽度高度
- 安卓获取本机ip地址的方法