引言
關於iOS 13
適配,有非常多寫的很不錯的文章,本文主要討論iOS 13
對於藍牙開發其中一個影響
下面是一個小編認爲關於iOS 13
適配寫得畢竟詳細得文章,以供參考
正題
藍牙
開發中,從藍牙設備獲取到的數據,都是以NSData
的形式接收,有的時候需要將NSData
數據轉換爲對應的十六進制字符串
進行操作。例如,定義設備名稱
爲廠商數據的某一個位置開始的N個字節
方案一
將NSData
利用initWithData:encoding:
將數據用UTF8
解碼轉換成字符串
NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
或者
NSString *string = [[NSString alloc] initWithBytes:data.bytes length:sizeof(data.bytes) encoding:NSUTF8StringEncoding];
使用這兩種方式會出現轉換出來的string
爲nil
的情況,這是由於NSData
數據本身並不是字符串
,所以使用UTF8轉碼
並不能夠如你所願,將NSData
轉換爲需要的字符串
,使用這個API
要求所操作的NSData
數據本身就是以字符串的形式傳輸過來的,這樣才能正常使用UTF8轉碼
轉換成對應的字符串
。
方案二
利用字符串格式化
功能進行轉換
NSString *string = [NSString stringWithFormat:@"%@", data];
注意:
使用這種方式進行轉換,在iOS 13之前是不會有問題的,能夠進行正常的轉換,但是iOS及以上版本則會出現問題,代碼如下:
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以下運行結果:
2019-11-29 17:58:46.452876+0800 Try[14226:4305384]
data:<00010203>
string:<00010203>
iOS 13及以上版本運行結果:
2019-11-29 18:05:30.485160+0800 Try[14120:3702326]
data:{length = 4, bytes = 0x00010203}
string:{length = 4, bytes = 0x00010203}
在iOS 13上並不會像之前那樣現實NSData的真正內容,而是顯示數據長度和對應內容的地址,因此
使用這種方式轉換,並不會得到想要內容的字符串!
劃重點!劃重點!劃重點!
對於這種情況,可以用以下方式進行轉換
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輸出結果如下:
2019-11-29 18:22:06.298658+0800 Try[14322:3711043]
mutaString:00010203
OK!搞定!下面就可以根據自己的需要進行操作了。