記錄藍牙中用到的進制換算

最近藍牙項目中,藍牙手環(huán)中的指令比較多,比如同步時間,發(fā)送震動指令,來點提醒等等,根據(jù)和硬件定義的規(guī)則來發(fā)送指令。
比如同步時間的指令:

<ab000009 00000000 01000100 04 +年月日時分秒>
這里的年月日時分秒都有一定的位數(shù)限制
比如年是6位,月是4位,日是5位,這就需要將本地時間給拆分,封裝出一個方法算出這串指令

直接上代碼

/**
 同步時間的指令
 根據(jù)當前年月日時分秒 根據(jù)規(guī)則先轉(zhuǎn)二進制,然后四位一組轉(zhuǎn)十六進制
 @return 返回的數(shù)據(jù)
 */
+ (NSString *)senderTimeCommand {
    
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSDate *nowdate = [NSDate date];
    NSDateComponents *comps = [[NSDateComponents alloc] init];
    NSInteger unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSWeekdayCalendarUnit |
    NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit | NSWeekCalendarUnit | NSWeekOfMonthCalendarUnit | NSWeekOfYearCalendarUnit;
    comps = [calendar components:unitFlags fromDate:nowdate];
    
    NSString *year = [[NSString stringWithFormat:@"%ld",(long)[comps year]] substringFromIndex:2];
    NSString *month = [NSString stringWithFormat:@"%ld",(long)[comps month]];
    NSString *day = [NSString stringWithFormat:@"%ld",(long)[comps day]];
    NSString *hour = [NSString stringWithFormat:@"%ld",(long)[comps hour]];
    NSString *minute = [NSString stringWithFormat:@"%ld",(long)[comps minute]];
    NSString *second = [NSString stringWithFormat:@"%ld",(long)[comps second]];
    // 十進制轉(zhuǎn)換為二進制帶位數(shù)
    NSString *yearByte = [self toBinarySystemWithDecimalSystem:[year intValue] length:6];//6位
    NSString *monthByte = [self toBinarySystemWithDecimalSystem:[month intValue] length:4];//4位
    NSString *dayByte = [self toBinarySystemWithDecimalSystem:[day intValue] length:5];//5位
    NSString *hourByte = [self toBinarySystemWithDecimalSystem:[hour intValue] length:5];//5位
    NSString *minuteByte = [self toBinarySystemWithDecimalSystem:[minute intValue] length:6];//6位
    NSString *secondByte = [self toBinarySystemWithDecimalSystem:[second intValue] length:6];//6位
    
    //將時間的二進制組合起來
    NSString *byteStr = [NSString stringWithFormat:@"%@%@%@%@%@%@",yearByte,monthByte,dayByte,hourByte,minuteByte,secondByte];
   //每4位轉(zhuǎn)換成十六進制
    NSString *byte0 = [byteStr substringToIndex:4];
    NSString *byte1 = [byteStr substringWithRange:NSMakeRange(4, 4)];
    NSString *byte2 = [byteStr substringWithRange:NSMakeRange(8, 4)];
    NSString *byte3 = [byteStr substringWithRange:NSMakeRange(12, 4)];
    NSString *byte4 = [byteStr substringWithRange:NSMakeRange(16, 4)];
    NSString *byte5 = [byteStr substringWithRange:NSMakeRange(20, 4)];
    NSString *byte6 = [byteStr substringWithRange:NSMakeRange(24, 4)];
    NSString *byte7 = [byteStr substringWithRange:NSMakeRange(28, 4)];
    

    NSString *finalStr = [NSString stringWithFormat:@"ab000009000000000100010004%@%@%@%@%@%@%@%@",[self getHexByBinary:byte0],[self getHexByBinary:byte1],[self getHexByBinary:byte2],[self getHexByBinary:byte3],[self getHexByBinary:byte4],[self getHexByBinary:byte5],[self getHexByBinary:byte6],[self getHexByBinary:byte7]];
    BYLog(@"%@",finalStr);
    return finalStr;
}

上面用到的方法

//  十進制轉(zhuǎn)二進制
- (NSString *)toBinarySystemWithDecimalSystem:(int)num length:(int)length
{
    int remainder = 0;      //余數(shù)
    int divisor = 0;        //除數(shù)
    
    NSString * prepare = @"";
    
    while (true)
    {
        remainder = num%2;
        divisor = num/2;
        num = divisor;
        prepare = [prepare stringByAppendingFormat:@"%d",remainder];
        
        if (divisor == 0)
        {
            break;
        }
    }
    //倒序輸出
    NSString * result = @"";
    for (int i = length -1; i >= 0; i --)
    {
        if (i <= prepare.length - 1) {
            result = [result stringByAppendingFormat:@"%@",
                      [prepare substringWithRange:NSMakeRange(i , 1)]];
            
        }else{
            result = [result stringByAppendingString:@"0"];
            
        }
    }
    return result;
}

二進制轉(zhuǎn)16進制


//2zhuan16
- (NSString *)getHexByBinary:(NSString *)binary {
    
    NSMutableDictionary *binaryDic = [[NSMutableDictionary alloc] initWithCapacity:16];
    [binaryDic setObject:@"0" forKey:@"0000"];
    [binaryDic setObject:@"1" forKey:@"0001"];
    [binaryDic setObject:@"2" forKey:@"0010"];
    [binaryDic setObject:@"3" forKey:@"0011"];
    [binaryDic setObject:@"4" forKey:@"0100"];
    [binaryDic setObject:@"5" forKey:@"0101"];
    [binaryDic setObject:@"6" forKey:@"0110"];
    [binaryDic setObject:@"7" forKey:@"0111"];
    [binaryDic setObject:@"8" forKey:@"1000"];
    [binaryDic setObject:@"9" forKey:@"1001"];
    [binaryDic setObject:@"A" forKey:@"1010"];
    [binaryDic setObject:@"B" forKey:@"1011"];
    [binaryDic setObject:@"C" forKey:@"1100"];
    [binaryDic setObject:@"D" forKey:@"1101"];
    [binaryDic setObject:@"E" forKey:@"1110"];
    [binaryDic setObject:@"F" forKey:@"1111"];
    
    if (binary.length % 4 != 0) {
        
        NSMutableString *mStr = [[NSMutableString alloc]init];;
        for (int i = 0; i < 4 - binary.length % 4; i++) {
            
            [mStr appendString:@"0"];
        }
        binary = [mStr stringByAppendingString:binary];
    }
    NSString *hex = @"";
    for (int i=0; i<binary.length; i+=4) {
        
        NSString *key = [binary substringWithRange:NSMakeRange(i, 4)];
        NSString *value = [binaryDic objectForKey:key];
        if (value) {
            
            hex = [hex stringByAppendingString:value];
        }
    }
    return hex;
}


然后發(fā)送這串指令,手環(huán)時間就同步了。

打工是不可能的.gif
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,732評論 6 539
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,214評論 3 426
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,781評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,588評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,315評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,699評論 1 327
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,698評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,882評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,441評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,189評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,388評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,933評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,613評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,023評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,310評論 1 293
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,112評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,334評論 2 377

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