2016-07-15 35 views
0

Ich versuche, ein Bild von einem Byte-Array anzuzeigen, das von einem Webdienst erstellt wird. Das Ausdrucken einer Beschreibung sieht so aus: ("-119", 80,78,71,13,10,26,10,0,0,0,13,3 ...) Aus dem Header ist klar dass es ein png ist, das in vorzeichenbehafteten Ganzzahlen codiert ist. Es ist ein __NSCFArray mit __NSCFNumber-Elementen.Signiertes Byte-Array zu UIImage

Mein Code in Objective-C (auf viel googeln basiert):

NSData *data = [NSData dataWithBytes:(const void *)myImageArray length [myImageArray count]]; 
UIImage *arrayImage = [UIImage imageWithData:data]; 

Ich erhalte einen Null-Zeiger UIImage. Ich habe auch versucht, es zunächst in nicht signierte NSNumbers zu konvertieren und dann an NSData zu übergeben, obwohl ich das vielleicht nicht richtig gemacht habe. Was mache ich falsch?

+0

Lesen Sie das gleiche Bild aus einer Datei und bestätigen Sie, dass der NSData-Inhalt korrekt ist. –

+0

Von einem Webservice? Wie waren die Daten dann? Welche Art? Wie lang ist es? Was ist 'imageArray' und was ist' myImageArray'? Wie lang ist das Array? Wenn es nicht zu lang ist (und das Inhaltsbild nicht "beleidigend oder privat"), können Sie es hier kopieren und wir können Ihr Problem finden. – Larme

+0

Vielen Dank für Ihre Hilfe. Ich konnte mit der Antwort unten lösen. – jaymo

Antwort

0

Sie können nicht einfach eine NSArray von NSNumber in Binärdaten umwandeln. Sowohl NSArray als auch NSNumber sind Objekte; Sie haben ihre eigenen Header und ihre interne Struktur, die nicht mit der ursprünglichen Bytefolge übereinstimmt. Sie müssen es Byte-für-Byte mit etwas in dieser Richtung konvertieren:

NSArray *bytes = @[@1, @2, @3]; 
NSMutableData *data = [NSMutableData dataWithLength:bytes.count]; 
for (NSUInteger i = 0; i < bytes.count; i++) { 
    char value = [bytes[i] charValue]; 
    [data replaceBytesInRange:NSMakeRange(i, 1) withBytes:&value]; 
} 

char ist ein int8_t unterzeichnet, die die Art von Daten zu sein scheint, mit dem Sie arbeiten. Es wird oft verwendet, um "ein ASCII-Zeichen" zu bedeuten, aber in C wird es gewöhnlich auch verwendet, um "Byte" zu bedeuten.

+0

Vielen Dank! Das hat funktioniert! Wie würden Sie diesen Prozess umkehren? – jaymo