Кодировка 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(ddp`ùıºIDAT

Другие вопросы по тегам