引言
关于iOS 13
适配,有非常多写的很不错的文章,本文主要讨论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!搞定!下面就可以根据自己的需要进行操作了。