按固定长度NSData到NSData的NSMutableArray

时间:2013-01-29 12:09:46

标签: objective-c nsdata

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

实施例: 输入:<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];
}

出于某种原因,这会让我感到兴奋。

1 个答案:

答案 0 :(得分: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];
}