引言
關(guān)于iOS 13適配,有非常多寫的很不錯(cuò)的文章,本文主要討論iOS 13對(duì)于藍(lán)牙開發(fā)其中一個(gè)影響
下面是一個(gè)小編認(rèn)為關(guān)于iOS 13適配寫得畢竟詳細(xì)得文章,以供參考
正題
藍(lán)牙開發(fā)中,從藍(lán)牙設(shè)備獲取到的數(shù)據(jù),都是以NSData的形式接收,有的時(shí)候需要將NSData數(shù)據(jù)轉(zhuǎn)換為對(duì)應(yīng)的十六進(jìn)制字符串進(jìn)行操作。例如,定義設(shè)備名稱為廠商數(shù)據(jù)的某一個(gè)位置開始的N個(gè)字節(jié)
方案一
將NSData利用initWithData:encoding:將數(shù)據(jù)用UTF8解碼轉(zhuǎn)換成字符串
NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
或者
NSString *string = [[NSString alloc] initWithBytes:data.bytes length:sizeof(data.bytes) encoding:NSUTF8StringEncoding];
使用這兩種方式會(huì)出現(xiàn)轉(zhuǎn)換出來的string為nil的情況,這是由于NSData數(shù)據(jù)本身并不是字符串,所以使用UTF8轉(zhuǎn)碼并不能夠如你所愿,將NSData轉(zhuǎn)換為需要的字符串,使用這個(gè)API要求所操作的NSData數(shù)據(jù)本身就是以字符串的形式傳輸過來的,這樣才能正常使用UTF8轉(zhuǎn)碼轉(zhuǎn)換成對(duì)應(yīng)的字符串。
方案二
利用字符串格式化功能進(jìn)行轉(zhuǎn)換
NSString *string = [NSString stringWithFormat:@"%@", data];
注意:使用這種方式進(jìn)行轉(zhuǎn)換,在iOS 13之前是不會(huì)有問題的,能夠進(jìn)行正常的轉(zhuǎn)換,但是iOS及以上版本則會(huì)出現(xiàn)問題,代碼如下:
uint8_t param[4] = {0x00,0x01,0x02,0x03};
NSData *data = [NSData dataWithBytes:param length:4];
NSString *string = [NSString stringWithFormat:@"%@", data];
NSLog(@"\ndata:%@\nstring:%@\n", data,string);
iOS 13以下運(yùn)行結(jié)果:
2019-11-29 17:58:46.452876+0800 Try[14226:4305384]
data:<00010203>
string:<00010203>
iOS 13及以上版本運(yùn)行結(jié)果:
2019-11-29 18:05:30.485160+0800 Try[14120:3702326]
data:{length = 4, bytes = 0x00010203}
string:{length = 4, bytes = 0x00010203}
在iOS 13上并不會(huì)像之前那樣現(xiàn)實(shí)NSData的真正內(nèi)容,而是顯示數(shù)據(jù)長(zhǎng)度和對(duì)應(yīng)內(nèi)容的地址,因此使用這種方式轉(zhuǎn)換,并不會(huì)得到想要內(nèi)容的字符串!
劃重點(diǎn)!劃重點(diǎn)!劃重點(diǎn)!
對(duì)于這種情況,可以用以下方式進(jìn)行轉(zhuǎn)換
NSMutableString *string = [[NSMutableString alloc] initWithCapacity:[data length]];
[data enumerateByteRangesUsingBlock:^(const void *bytes, NSRange byteRange, BOOL *stop) {
unsigned char *dataBytes = (unsigned char*)bytes;
for (NSInteger i = 0; i < byteRange.length; i++) {
NSString *hexStr = [NSString stringWithFormat:@"%x", (dataBytes[i]) & 0xff];
if ([hexStr length] == 2) {
[string appendString:hexStr];
} else {
[string appendFormat:@"0%@", hexStr];
}
}
}];
NSLog(@"\nmutaString:%@", string);
iOS 13輸出結(jié)果如下:
2019-11-29 18:22:06.298658+0800 Try[14322:3711043]
mutaString:00010203
OK!搞定!下面就可以根據(jù)自己的需要進(jìn)行操作了。
感謝觀眾老哥的閱讀 _