NSData для NSMutableArray NSData по фиксированной длине

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

Example: input:

output:

Я пробую вот так:

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.

0
nl ja de

1 ответы

[data getотtes:отte range:NSMakeRange(i, 16)];

копирует данные в память, указанную отte , она не выделяет память. Копирование сбоев данных, потому что отte == NULL не указывает на действительную память. Замена

unsigned char *отte = NULL;

от

unsigned char отte[16];

должен решить проблему. Но учтите, что

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

is even easier and does not require the отte buffer at all.

Отметим также, что цикл 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];
}
5
добавлено
@ Датенши: Добро пожаловать!
добавлено автор Martin R, источник
Вау .. Спасибо за отличное объяснение и отличный ответ. Я определенно узнал кое-что из этого. Еще раз спасибо.
добавлено автор Datenshi, источник