0

我试图从 NSData 获取 NSMutableArray 16 个字节,但没有这样做。也许任何人都可以指出我正确的方向。

示例:输入:<c4ebc39d edf81fe6 09e0a41a 34b4d20d c4ebc39d edf81fe6 09e0a41a 34b4d20d>

输出:<c4ebc39d edf81fe6 09e0a41a 34b4d20d> <c4ebc39d edf81fe6 09e0a41a 34b4d20d>

我正在尝试这样:

NSMutableArray *blocks = [[NSMutableArray alloc]init];
for (NSUInteger i = 0; i <= [data length]; i=i+16) {
    unsigned char *byte = NULL;
    [data getBytes:byte range:NSMakeRange(i, 16)];
    NSData *temp = [[NSData alloc] initWithBytes:byte length:sizeof(byte)];
    [blocks addObject:temp];
}

出于某种原因,这让我感到 exc_bad_access。

4

1 回答 1

5
[data getBytes:byte range:NSMakeRange(i, 16)];

将数据复制到 指向的内存中byte,它不分配内存。复制数据崩溃,因为byte == NULL不指向有效内存。更换

unsigned char *byte = NULL;

经过

unsigned char byte[16];

应该解决问题。但请注意

NSData *temp = [data subdataWithRange:NSMakeRange(i, 16)];

更容易,根本不需要字节缓冲区。

还要注意 for 循环

for (NSUInteger i = 0; i <= [data length]; i=i+16)

应该改为

for (NSUInteger i = 0; i <= [data length] - 16; i=i+16)

避免对data对象的访问超出其范围。

您的循环将如下所示:

for (NSUInteger i = 0; i <= [data length] - 16; i = i + 16) {
    NSData *temp = [data subdataWithRange:NSMakeRange(i, 16)];
    [blocks addObject:temp];
}
于 2013-01-29T12:24:40.467 回答