2016-12-14 84 views
0

如何將NSData對象轉換爲可讀的浮點數組?所以我基本上可以在數組中選擇一個點並獲得一個值?目前,我有以下NSData將getBytes轉換爲可讀的浮點數

NSData *depthData = [NSData dataWithBytes:depthFrame.depthInMillimeters 
             length:depthFrame.width*depthFrame.height*4]; 
float z; 
[depthImageData getBytes:&z length:sizeof(float)]; 
NSLog(@"%f", z); 

但是,如何將有可能轉換成說

NSLog(@"%f",depthFloatArry[100]) 

回答

2

這不是完全清楚你問什麼。

如果你說depthFrame.depthInMillimeters是包含depthFrame.width * depthFrame.heightfloat個字節的緩衝區,那麼你有兩個選擇:

  • 如果你確保該字節的緩衝區正確對齊等等每個float開始在一個內存位置,其地址是4個字節的倍數,你可以簡單地用一個類型轉換:

    float *floatArray = (float*)depthFrame.depthInMillimeters; 
    NSLog(@"%f", floatArray[anyIndexInRange]); 
    

    這避免總共NSData

  • 否則,如果該數據未對齊,或者您需要或者已經有NSData其他一些原因,你可以做這樣的事情一下子得到很多float S:

    size_t len = /* any value between 1 and depthFrame.width * depthFrame.height */; 
    float floatArray[len]; 
    [depthData getBytes:floatArray length:sizeof(floatArray)]; /* or sizeof(float) * len */ 
    
  • 如果你只是想從NSData任意單精度浮點,而不是隻是第一個,你可以這樣做:

    NSUInteger offset = desiredIndex * sizeof(float); 
    float z; 
    [depthData getBytes:&z range:NSMakeRange(offset, sizeof(z))]; 
    
-1

一種方法是將NSData內容轉換爲NSNumberNSArray一個實例 - 請注意,你」因爲NSArray只能容納物體,所以需要將浮體包裹到NSNumber中。

@interface NSData(MyConversion) 
- (NSArray<NSNumber *> *)toFloatsArray; 
@end 

@implementation NSData(MyConversion) 
- (NSArray<NSNumber *> *)toFloatsArray { 
    NSInteger capacity = self.length/sizeof(float); 
    NSMutableArray<NSNumber *> *parsedNumbers = [[NSMutableArray alloc] initWithCapacity:capacity]; 
    for(NSInteger i=0; i<capacity; i++) { 
     float aFloat; 
     [self getBytes:&aFloat range:NSMakeRange(i*sizeof(float), sizeof(float))]; 
     [parsedNumbers addObject:@(aFloat)]; 
    } 
    return parsedNumbers; 
} 
@end 

,你可以使用它像這樣:

NSArray<NSNumber *> *numbers = [depthImageData toFloatsArray]; 
NSLog(@"%f", numbers[100].floatValue); 
// or 
NSLog(@"%@", numbers[100]);