Domanda

voglio convertire NSData a un array di byte, quindi scrivo il seguente codice:

NSData *data = [NSData dataWithContentsOfFile:filePath];
int len = [data length];
Byte byteData[len];
byteData = [data bytes];

Ma l'ultima riga di codice si apre un errore che dice "tipi incompatibili di assegnazione". Qual è il modo corretto per convertire i dati in array di byte, allora?

È stato utile?

Soluzione

Non è possibile dichiarare un array usando una variabile in modo Byte byteData[len]; non funzionerà. Se si desidera copiare i dati da un puntatore, è inoltre necessario memcpy (che passerà attraverso i dati a cui punta il puntatore e copiare ogni byte fino ad una lunghezza specificata).

Prova:

NSData *data = [NSData dataWithContentsOfFile:filePath];
NSUInteger len = [data length];
Byte *byteData = (Byte*)malloc(len);
memcpy(byteData, [data bytes], len);

Questo codice allocare dinamicamente la matrice per il formato corretto (è necessario free(byteData) quando hai finito) e copiare i byte in esso.

Si potrebbe anche usare getBytes:length: come indicato da altri, se si vuole utilizzare un array di lunghezza fissa. Questo evita malloc / gratuita, ma è meno estensibile e più inclini a tamponare problemi di dimensioni così ho raramente uso.

Altri suggerimenti

Si potrebbe anche solo usare i byte dove sono, gettandoli per il tipo di cui avete bisogno.

unsigned char *bytePtr = (unsigned char *)[data bytes];

già risposto, ma generalizzare per aiutare altri lettori:

    //Here:   NSData * fileData;
    uint8_t * bytePtr = (uint8_t  * )[fileData bytes];

    // Here, For getting individual bytes from fileData, uint8_t is used.
    // You may choose any other data type per your need, eg. uint16, int32, char, uchar, ... .
    // Make sure, fileData has atleast number of bytes that a single byte chunk would need. eg. for int32, fileData length must be > 4 bytes. Makes sense ?

    // Now, if you want to access whole data (fileData) as an array of uint8_t
    NSInteger totalData = [fileData length] / sizeof(uint8_t);

    for (int i = 0 ; i < totalData; i ++)
    {
        NSLog(@"data byte chunk : %x", bytePtr[i]);
    }

La firma di -[NSData bytes] è - (const void *)bytes. Non è possibile assegnare un puntatore a una matrice sullo stack. Se si desidera copiare il buffer gestito dall'oggetto NSData nella matrice, utilizzare -[NSData getBytes:]. Se si vuole farlo senza copiare, quindi non allocare un array; basta dichiarare una variabile puntatore e lasciare NSData gestire la memoria per voi.

Questo perché il tipo di ritorno per [byte di dati] è un void * serie c-stile, non un Uint8 (che è ciò che Byte è un typedef per).

L'errore è dovuto al fatto che si sta tentando di impostare una matrice allocata quando il rendimento è un tipo di puntatore, ciò che si sta cercando è la getBytes: lunghezza: chiamare, che sarebbe simile:

[data getBytes:&byteData length:len];

che riempie l'array è stato assegnato con i dati dell'oggetto NSData.

Ecco quello che credo è l'equivalente Swift:

if let data = NSData(contentsOfFile: filePath) {
   let length = data.length
   let byteData = malloc(length)
   memcmp(byteData, data.bytes, length)
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top