2015-08-18 24 views
6

Ho un'app per Android che utilizza Base64 per codificare le immagini e le stringhe codificate sono memorizzate su un server. Ora sto creando un client iOS per la stessa app e sto faticando a farlo codificare le immagini allo stesso modo Le immagini codificate su Android decodificheranno in Swift iOS ma le immagini codificate in Swift NON verranno decodificate in Android, o qui http://www.freeformatter.com/base64-encoder.html (il file risultante non è un'immagine valida)La codifica Base64 in Swift non decodifica in Android

immagini codificate in iOS decodifica in iOS

in Android, sto usando il seguente per codificare e decodificare

public static String encodeBitmap(Bitmap bitmap) { 
    Bitmap immagex = bitmap; 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    immagex.compress(Bitmap.CompressFormat.PNG, 100, baos); 
    byte[] b = baos.toByteArray(); 
    String imageEncoded = Base64.encodeToString(b, Base64.DEFAULT); 
    return imageEncoded; 
} 

public static Bitmap decodeBitmap(String encodedString) { 
    byte[] decodedByte = Base64.decode(encodedString, Base64.DEFAULT); 
    Bitmap b = BitmapFactory.decodeByteArray(decodedByte, 0, 
      decodedByte.length); 
    return b; 
} 

e quanto segue sul Lato iOS

static func decodeImage(str: String) -> UIImage?{ 
    if let decodedData = NSData(base64EncodedString: str, options: NSDataBase64DecodingOptions.IgnoreUnknownCharacters){ 
     var iconValue:UIImage? = UIImage(data: decodedData) 
     return iconValue 
    } 
    return nil 
} 

static func encodeImage(image: UIImage) -> String{ 
    var imageData = UIImagePNGRepresentation(image) 
    let base64 = imageData.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.Encoding76CharacterLineLength) 
    return base64 
} 

}

Sono disposto a cambiare sia il programma e farlo funzionare

Esempio: prendere questa immagine per esempio https://pbs.twimg.com/profile_images/522909800191901697/FHCGSQg0.png

Su Android esso codifica per http://pastebin.com/D41Ldjis

E su iOS a http://pastebin.com/fEUZSJvF

iOS uno ha un numero di caratteri molto più grande

+0

ogni esempio vedo con spettacoli Swift Questo 'imageData.base64EncodedStringWithOptions (.allZeros)' – tyczj

+0

@tyczj Ho provato anche questo, ho provato 76 perché ho notato la stringa prodotto da Android ha nuove linee ogni 76 ° carattere –

+0

Aggiungere un esempio, dump esadecimale dati e stringa Base64. Li hai paragonati visivamente? Le lunghezze sono le stesse? Sono codificati tramite URL durante il trasferimento? – zaph

risposta

3

Il Base64 provoided proviene da diverse codifiche PNG. Le intestazioni sono diverse, Android ha un blocco "sBIT" e iOS ha un blocco "sRGB".

Quindi il problema non è Base64 ma le rappresentazioni preassemblate dai due sistemi.

porzioni decodificati

Android:
APNG

IHDR †† ≠ zsBIT € · O ‡ ÑIDAT

iOS:
APNG

IHDR »» ≠ XÆûsRGBÆŒÈiDOTd (ddp`ùıºIDAT

+0

Come potrei risolvere questo? C'è un modo per costringerne uno a usare la codifica dell'altro? –

+0

@zaph meglio fornire valori esadici invece di ascii –

+0

In realtà questo è esattamente ciò che voglio presentare, l'unica cosa che mi interessa sono i tag chunk che sono in ASCII: PNG, IHDR, sBIT, sRGB e IDAT. – zaph