Кодировка Base64 в Swift не будет декодироваться в Android
У меня есть приложение для Android, которое использует Base64 для кодирования изображений, а закодированные строки хранятся на сервере. Сейчас я делаю iOS-клиент для того же приложения и пытаюсь сделать так, чтобы оно кодировало изображения таким же образом. Изображения, закодированные на стороне Android, будут декодироваться в Swift iOS, но изображения, закодированные в Swift, НЕ будут декодироваться в Android, или здесь http://www.freeformatter.com/base64-encoder.html (полученный файл не является допустимым изображением)
Изображения, закодированные в iOS, будут декодироваться в iOS
В Android я использую следующее для кодирования и декодирования
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;
}
И следующее на стороне 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
}
}
Я готов изменить любого клиента, чтобы он работал
Пример: возьмите это изображение, например, https://pbs.twimg.com/profile_images/522909800191901697/FHCGSQg0.png
На Android кодируется по http://pastebin.com/D41Ldjis
И на iOS для http://pastebin.com/fEUZSJvF
iOS один имеет гораздо большее количество символов
1 ответ
Base64 предоставлены из разных кодировок PNG. Заголовки разные, у Android есть чанк sBIT, а у iOS чанк sRGB.
Таким образом, проблема не в Base64, а в представлении двух систем.
Декодированные части
Android:
APNG
IHDR †† ≠ zsBIT € · O ‡ ÑIDAT
IOS:
APNG
IHDR "" ≠XÆûsRGBÆŒÈiDOTd(ddp`ùıºIDAT