我正在使用CoreBluetooth
框架,在我更新了特征值后,我从外设获得了回调didUpdateValueForCharacteristic
。在这里,我发现一个片段解码了返回的NSData
对象中的数据:
- (void) peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error{
NSUInteger *flags = (NSUInteger*) [[[characteristic value] subdataWithRange:NSMakeRange(0, 1)] bytes];
NSUInteger length;
if(*flags & 0x01)
{
length = 2;
}
else
{
length = 1;
}
NSUInteger *measurement = (NSUInteger*) [[[characteristic value] subdataWithRange:NSMakeRange(1, length)] bytes];
NSLog(@"Value read from char: %d", *measurement);
}
此处代码抛出异常:
*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSConcreteData subdataWithRange:]: range {1, 1} exceeds data length 1'
有人可以解释原因吗?我应该读取的值应该是1个字节。
答案 0 :(得分:1)
当您在subdataWithRange:NSMakeRange(1, length)
上呼叫characteristic
时,您要求提供不存在的数据。在尝试从中提取数据之前,应检查characteristic
的长度。您还应该检查逻辑,看看您如何确定characteristic
中应该有多少数据,因为这似乎是无效的。