2013-01-29 4 views
0

Я пытаюсь получить NSMutableArray из NSData на 16 байт, но этого не сделать. Может быть, кто-нибудь может указать мне в правильном направлении.NSData to NSMutableArray NSData по фиксированной длине

Пример: вход: <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.

ответ

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 (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]; 
} 
+0

Вау .. Спасибо за большое объяснение и большой ответ. Я определенно узнал кое-что из этого. Еще раз спасибо. – Datenshi

+0

@ Датенши: Добро пожаловать! –