2014-11-13 2 views
0

나는 CoreBluetooth를 통해 보낼 수 있도록 작은 < 크기의 청크로 NSData를 분할하려하지만 어떤 이유로 끔찍한 엉망으로 만들기로 결정했습니다. 데이터를 결합하고 객체를 디코딩하려는 사실에 의해 입증되었습니다. 같은 방법으로 실패합니다. 이 때문에 NSData를 잘못 나눕니다. 여기 NSData를 올바르게 분할하는 방법은 무엇입니까?

내가 그것을 분할하기 위해 사용하고 코드입니다

// Split up the data and put into Array 
NSUInteger length = [data length]; 
NSUInteger chunkSize = 100; 
NSUInteger offset = 0; 
do { 
    NSUInteger thisChunkSize = length - offset > chunkSize ? chunkSize : length - offset; 
    NSData* chunk = [NSData dataWithBytesNoCopy:(char *)[data bytes] + offset 
        length:thisChunkSize freeWhenDone:NO]; 
        offset += thisChunkSize; 

    [orderQueue addObject:chunk]; 
} while (offset < length); 

이 데이터는 다음 재결합 (! 유래에 어떤 종류의 낯선에서 가져온)와 객체는 너무 언 아카이브 :

NSMutableData *finishedData = [[NSMutableData alloc] init]; 
for (NSData *dataChunk in orderQueue) { 
     [finishedData appendData:dataChunk]; 
    } 
Order *order = [NSKeyedUnarchiver unarchiveObjectWithData:finishedData]; // ERRORS OUT ON THIS LINE 

finishedData = [[NSMutableData alloc] init]; 
dataChunks = [[NSMutableArray alloc] init]; 

종이에, 나는 솔직히 내가 올바르게하고 있다고 생각하지만 가끔 버그가 나온다. 왜 이런 생각일까요? 이해할 수없는 아카이브 (0x62, 0x70, 0x6c, 0x69,에는 0x73, 따라 0x74 : - : [NSKeyedUnarchiver initForReadingWithData :] '* :

응용 프로그램을 종료

* 인해 캐치되지 않는 예외'NSInvalidArgumentException ', 이유에 : < 나는 다음과 같은 오류가 발생합니다 , 0x30, 0x30) '

+1

원본 NSData 객체가 언제든지 바이 바이로 갈 수 있으므로'dataWithBytesNoCopy' 사용에 대해 궁금합니다. 따라서 하나의 NSData 내부의 주소를 다른 NSData에 저장하면 첫 번째 NSData가 사라지고 무엇을 얻게됩니까? 쓰레기, 나는 의심한다. –

+0

@HotLicks :'- [NSData bytes]'는'objc_inner_pointer'로 표시되어 있습니다 (http://lists.apple.com/archives/cocoa-dev/2012/May/msg00469.html). '데이터'는 '청크 (chunk)'만큼 오래 지속될 것입니다. –

답변

0

로직을 확인하기 위해이 코드를 실행했는데 정확합니다.

NSMutableArray *orderQueue = [[NSMutableArray alloc] init]; 
NSString *originalString = @"Here are some strings for you."; 
for (NSInteger i = 0; i < 1000; ++i) 
{ 
    @autoreleasepool { 
     originalString = [originalString stringByAppendingString:@"\nHere are some strings for you."]; 
    } 
} 
NSData *data = [originalString dataUsingEncoding:NSUTF8StringEncoding]; 
// Split up the data and put into Array 
NSUInteger length = [data length]; 
NSUInteger chunkSize = 100; 
NSUInteger offset = 0; 
do { 
    NSUInteger thisChunkSize = length - offset > chunkSize ? chunkSize : length - offset; 
    NSData* chunk = [NSData dataWithBytesNoCopy:(char *)[data bytes] + offset 
             length:thisChunkSize freeWhenDone:NO]; 
    offset += thisChunkSize; 

    [orderQueue addObject:chunk]; 
} while (offset < length); 

NSMutableData *finishedData = [[NSMutableData alloc] init]; 
for (NSData *dataChunk in orderQueue) { 
    [finishedData appendData:dataChunk]; 
} 
NSString *recreatedString = [[NSString alloc] initWithData:finishedData encoding:NSUTF8StringEncoding]; 
NSLog(@"%@", recreatedString); 
NSLog(@"%@", [originalString isEqualToString:recreatedString] ? @"Equal" : @"Error"); 

귀하의 오류가 잠재적 방법으로 당신이 Order 클래스의 <NSCoding> 프로토콜에 대응하고, 다른 곳에서해야합니다.

관련 문제