¿Cómo se convierte un objeto NSData en una matriz flotante legible? Entonces, ¿básicamente puedo elegir un punto dentro de esa matriz y recuperar un valor? Actualmente, tengo lo siguiente

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

Pero, ¿cómo sería posible convertir para decir

NSLog(@"%f",depthFloatArry[100])
1
James Reeves 15 dic. 2016 a las 00:53

2 respuestas

La mejor respuesta

No está del todo claro lo que está pidiendo.

Si está diciendo que depthFrame.depthInMillimeters es un búfer de bytes que contiene depthFrame.width * depthFrame.height float, entonces tiene un par de opciones:

  • Si está seguro de que el búfer de bytes está correctamente alineado para que cada float comience en una ubicación de memoria cuya dirección sea un múltiplo de 4 bytes, simplemente puede usar un tipo de conversión:

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

    Esto evita NSData por completo.

  • De lo contrario, si los datos no están alineados o si necesita o ya tiene el NSData por alguna otra razón, puede hacer algo como esto para obtener muchos float s a la vez:

    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 */
    
  • Si solo desea obtener un solo flotante arbitrario de NSData en lugar de solo el primero, puede hacer esto:

    NSUInteger offset = desiredIndex * sizeof(float);
    float z;
    [depthData getBytes:&z range:NSMakeRange(offset, sizeof(z))];
    
2
Ken Thomases 14 dic. 2016 a las 22:39

Un enfoque sería convertir el contenido de NSData en un NSArray de NSNumber instancias; tenga en cuenta que necesitará envolver los flotantes en un NSNumber, como {{X4 }} solo puede contener objetos.

@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

, que puedes usar así:

NSArray<NSNumber *> *numbers = [depthImageData toFloatsArray];
NSLog(@"%f", numbers[100].floatValue);
// or
NSLog(@"%@", numbers[100]);
0
Cristik 15 dic. 2016 a las 07:43