2015-08-18 16 views
6

Mam aplikację na Androida, która używa Base64 do kodowania obrazów, a zakodowane ciągi są przechowywane na serwerze. Teraz robię klienta iOS dla tej samej aplikacji i próbuję zmusić go do kodowania obrazów w ten sam sposób. Obrazy zakodowane na końcu androida będą dekodować w Swift iOS, ale obrazy zakodowane w Swift NIE odszyfrują w systemie Android, lub tutaj http://www.freeformatter.com/base64-encoder.html (wynikowy plik nie jest prawidłowym obrazem)Kodowanie Base64 w Swift nie będzie dekodowane w Androidzie

obrazy zakodowane w iOS zdekodują w iOS

w Androidzie, używam następujących aby kodowania i dekodowania

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; 
} 

i po sprawie Strona 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 
} 

}

Jestem gotów zmienić dla klienta, aby to działało

Przykład: wziąć ten obraz np https://pbs.twimg.com/profile_images/522909800191901697/FHCGSQg0.png

Na Androidzie koduje do http://pastebin.com/D41Ldjis

I na iOS to http://pastebin.com/fEUZSJvF

System iOS ma znacznie większą liczbę znaków:

+0

każdy przykład widzę z szybkimi To pokazuje 'imageData.base64EncodedStringWithOptions (.allZeros)' – tyczj

+0

@tyczj Próbowałem że też próbowałem 76 bo zauważyłem ciąg wyprodukowany przez Androida ma nowe linie co 76. znak –

+0

Dodaj przykład, zrzut danych hex i ciąg Base64. Porównałeś je wizualnie? Czy długości są takie same? Czy są one zakodowane przy przesyłaniu adresu URL? – zaph

Odpowiedz

3

Prowadniki Base64 są z różnych kodowań PNG. Nagłówki są różne, Android ma "sBIT", a iOS ma "sRGB".

W ten sposób problem nie dotyczy Base64, ale reprezentantów reprezentowanych przez dwa systemy.

zdekodowanej części

ANDROID
APNG

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

iOS:
APNG

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

+0

Jak mógłbym to rozwiązać? Czy istnieje sposób zmuszenia kogoś do użycia kodowania innego? –

+0

@zaph lepiej podać wartości szesnastkowe zamiast ascii –

+0

Właściwie to właśnie chcę zaprezentować, jedyne co mnie interesuje to znaczniki porcji, które są w ASCII: PNG, IHDR, sBIT, sRGB i IDAT. – zaph

Powiązane problemy