網(wǎng)上找,沒找到現(xiàn)成的好用的足画,github上倒是有一個工具類雄驹,不太會用
所以找了個C語言寫的,然后復(fù)合在OC代碼里面
實驗結(jié)果正確淹辞,可以去測試医舆,有在線測試的工具,請放心使用象缀,分享給大家:
下面涉及到的其他封裝好的方法還有兩個
- seperateStr: .....
- decimalString ......
放到最下面了
J呓!攻冷!還有一定要看最下面的 注 M薜ā!等曼!
// 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進(jìn)制轉(zhuǎn)換成10進(jìn)制
}
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: 這幾個方法都可以放在工具類里面 用工具類 調(diào)用 (把實例方法改成類方法就可以)
感謝凿蒜,那個用c語言寫出來的人。
附上他的鏈接:https://blog.csdn.net/u013625451/article/details/81239572
P埠凇7戏狻!注:有的時候 反的是 3位的 丧蘸,如果是3位就前面加個0湊4位就可以了