Frage

Ich mag NSData auf eine Byte-Array konvertieren, so schreibe ich den folgenden Code:

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

Aber die letzte Zeile des Codes erscheint eine Fehlermeldung „inkompatible Typen in Zuweisung“ zu sagen. Was ist der richtige Weg, um die Daten zu Byte-Array dann zu konvertieren?

War es hilfreich?

Lösung

Sie können nicht ein Array mit einer Variablen deklarieren, so Byte byteData[len]; wird nicht funktionieren. Wenn Sie die Daten aus einem Zeiger kopieren möchten, müssen Sie auch MEMCPY (die durch den Zeiger durch die Daten zu spitz gehen und kopieren jeweils auf eine bestimmte Länge Byte nach oben).

Versuchen:

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

Dieser Code wird dynamisch das Array auf die richtige Größe zuordnen (Sie müssen free(byteData) wenn Sie fertig sind) und die Bytes hinein kopieren.

Sie können auch getBytes:length: verwenden, wie von anderen angezeigt, wenn Sie eine feste Länge Array verwenden möchten. Dies vermeidet malloc / free, ist aber weniger dehnbar und anfällige Überlaufprobleme zu puffern, damit ich es nur selten verwendet werden.

Andere Tipps

Sie können auch einfach die Bytes, wo sie sind, so dass sie auf die Art Gießen Sie benötigen.

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

Bereits beantwortet, aber zu verallgemeinern anderen Lesern zu helfen:

    //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]);
    }

Die Signatur von -[NSData bytes] ist - (const void *)bytes. Sie können einen Zeiger auf ein Array auf dem Stapel zuweisen. Wenn Sie den Puffer durch das NSData Objekt in das Array verwaltet kopieren möchten, verwenden Sie -[NSData getBytes:]. Wenn Sie es, ohne zu kopieren tun wollen, dann nicht ein Array zuweisen; nur eine Zeigervariable deklarieren und lassen NSData für Sie den Speicher verwalten.

Das ist, weil der Rückgabetyp für [Datenbytes] a void * c-style-Array ist, kein Uint8 (das ist, was Byte ist ein typedef für).

Der Fehler ist, weil Sie eine zugewiesene Array zu setzen versuchen, wenn die Rückkehr ein Zeigertyp ist, was Sie suchen, ist das getBytes: Länge: nennen, die aussehen würde:

[data getBytes:&byteData length:len];

Welche füllt das Array Sie mit Daten aus dem NSData Objekt zugewiesen haben.

Hier ist, was ich glaube, das Swift entspricht:

if let data = NSData(contentsOfFile: filePath) {
   let length = data.length
   let byteData = malloc(length)
   memcmp(byteData, data.bytes, length)
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top