NSData范围出错

时间:2013-07-30 08:36:50

标签: ios nsdata

我正在使用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个字节。

1 个答案:

答案 0 :(得分:1)

当您在subdataWithRange:NSMakeRange(1, length)上呼叫characteristic时,您要求提供不存在的数据。在尝试从中提取数据之前,应检查characteristic的长度。您还应该检查逻辑,看看您如何确定characteristic中应该有多少数据,因为这似乎是无效的。