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 に答える