iOS 用Objective-C寫CRC16位 MODBUS 校驗

網(wǎng)上找,沒找到現(xiàn)成的好用的足画,github上倒是有一個工具類雄驹,不太會用

所以找了個C語言寫的,然后復(fù)合在OC代碼里面

實驗結(jié)果正確淹辞,可以去測試医舆,有在線測試的工具,請放心使用象缀,分享給大家:

下面涉及到的其他封裝好的方法還有兩個

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末漂洋,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子力喷,更是在濱河造成了極大的恐慌刽漂,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件弟孟,死亡現(xiàn)場離奇詭異贝咙,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)拂募,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門庭猩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人陈症,你說我怎么就攤上這事蔼水。” “怎么了录肯?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵趴腋,是天一觀的道長。 經(jīng)常有香客問我嘁信,道長于样,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任潘靖,我火速辦了婚禮穿剖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘卦溢。我一直安慰自己糊余,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布单寂。 她就那樣靜靜地躺著贬芥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪宣决。 梳的紋絲不亂的頭發(fā)上蘸劈,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天,我揣著相機(jī)與錄音尊沸,去河邊找鬼威沫。 笑死贤惯,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的棒掠。 我是一名探鬼主播孵构,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼烟很!你這毒婦竟也來了颈墅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤雾袱,失蹤者是張志新(化名)和其女友劉穎恤筛,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谜酒,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡叹俏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了僻族。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡屡谐,死狀恐怖述么,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情愕掏,我是刑警寧澤度秘,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站饵撑,受9級特大地震影響剑梳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜滑潘,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一垢乙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧语卤,春花似錦追逮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至眼滤,卻和暖如春巴席,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背诅需。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工漾唉, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留睬关,地道東北人。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓毡证,卻偏偏與公主長得像电爹,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子料睛,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容