2013-09-10 6 views
3

Я пытаюсь превратить NSArray из CGPoints в NSData. Я не могу понять, как это сделать.Включить NSArray CGPoints в блок NSData

Согласно http://www.raywenderlich.com/12910/how-to-make-a-simple-playing-card-game-with-multiplayer-and-bluetooth-part-3

 NSString *string = @"example" 
    const char *cString = [string UTF8String]; 
    [self appendBytes:cString length:strlen(cString) + 1]; 

так с NSArray из CGPoint с, я не могу понять, как я могу преобразовать в NSData?

+0

Я хотел бы видеть код, в котором вы сделали NSArray из CGPoints. Предположительно, они завернуты, как в NSValues? – danh

ответ

1

Один из способов превратить ваши точки в массив C, затем сделать NSData из него:

NSMutableArray *array = [NSMutableArray array]; 
[array addObject:[NSValue valueWithCGPoint:pt1]]; 
[array addObject:[NSValue valueWithCGPoint:pt2]]; 
size_t total = sizeof(CGPoint)*array.count; 
CGPoint *buf = malloc(total); 
CGPoint *ptr = buf; 
for (NSValue *v in array) { 
    *ptr = v.CGPointValue; 
} 
NSData *res = [NSData initWithBytesNoCopy:buf length:total]; 
1

Вы можете попробовать:

NSData * d = [NSData dataWithBytes:&tests[0] length:16] ; 

И потом:

[d getBytes:&recovered[0] length:16] ; 

Как в:

CGPoint tests[] = { 
     {10.0f, 20.0f} 
    , {20.0f, 30.0f} 
    } ; 
    // 2 points each with 2 floats = 4 values of 4 bytes each = 16 bytes 
    NSData * d = [NSData dataWithBytes:&tests[0] length:16] ; 
    NSLog(@"NSData: %@", d) ; 

    CGPoint recovered[2] ; 
    [d getBytes:&recovered[0] length:16] ; 
    NSLog(@"P1: %@, P2: %@", NSStringFromCGPoint(recovered[0]), NSStringFromCGPoint(recovered[1])) ; 

Это, вероятно, самый прямой путь.

Это печатает:

2013-09-10 04:05:24.468 SoloTouch[55207:c07] NSData: <00002041 0000a041 0000a041 0000f041> 
2013-09-10 04:05:43.566 SoloTouch[55207:c07] P1: {10, 20}, P2: {20, 30} 
Смежные вопросы