将base64解码为uiimage iOS Swift

时间:2015-07-10 18:02:47

标签: ios objective-c xcode swift base64

decodedData为nil,但我的base64String包含一个非常长的字符串

编码

var imgProfile:NSData = UIImagePNGRepresentation(imgUI)
let base64String = imgProfile.base64EncodedStringWithOptions(.allZeros)

解码

let base64String = prefs.valueForKey("imgDefault") as? String         
let decodedData = NSData(base64EncodedString: base64String!, options: NSDataBase64DecodingOptions(rawValue: 0) )
var decodedimage = UIImage(data: decodedData!)

enter image description here


enter image description here

我无法从base64输出我的图片

在插入db:

之前

base64字符串ENCODE

  

iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAMAAADDpiTIAAAADFBMVEXFxcX //// p6enW1tbAmiBwAAAAHGlET1QAAAACAAAAAAAAAQAAAAAoAAABAAAAAQAAAAYAppse6QAABcxJREFUeAHs3et22jAQReEQ3v + di8sikDaxZeGLdPTxpzS202jP9pwRkNWPDw8EEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQiCVwvV4 / p8fl9fH3K7cjsau2sBuBqfKvVf / X + ecnDQJtKSn9qw83DQIpDLqktcV / iECCAGFuXf9Rz6o / 5UHPEtTe + t9V0Qj6dGCb6t9d4EBvDrzb + B / 3gOlvsqAjB97M / F + RF / + KjUEfDuxU / nsb6APBwD / llsn / UycwDTQt1443 / 9MGSdCqA4eUXxK0Wv6P917xed7hJc8 + m6Uw7A922O1 / 90MOtGXaweWXA8OXnwINKXAtSe1dzvGWcQManND9nzIZBU434MjZ / 1n45zP7gVMVOPX2v1ugCZxowHnp / 2wBl4tJ4CwFzm7 / DwvEwCkGNND + vwzQBI5XoI32 / 1CAAUcb0Er7fxggBg41oKH2 / 2WAJnCcAg3Wf / rU4HEABv + Xmqw / Aw6zsq3x7xEB0596wBEStFt / Boxefwbsb0Br27 / XBJie2w7u60Dr9WfA6PVnwJ4GtDz / PbPAXmAvB / qov0lw9PozYB8Dern / pyyQAts70 Ojrv8 / of33mfYHNBeiq / t4X2L

从db:

下拉时,

base64字符串DECODE

  

可选(“iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAMAAADDpiTIAAAADFBMVEXFxcX //// p6enW1tbAmiBwAAAAHGlET1QAAAACAAAAAAAAAQAAAAAoAAABAAAAAQAAAAYAppse6QAABcxJREFUeAHs3et22jAQReEQ3v   di8sikDaxZeGLdPTxpzS202jP9pwRkNWPDw8EEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQiCVwvV4 / p8fl9fH3K7cjsau2sBuBqfKvVf / X   ecnDQJtKSn9qw83DQIpDLqktcV / iECCAGFuXf9Rz6o / 5UHPEtTe   t9V0Qj6dGCb6t9d4EBvDrzb b / 3gOlvsqAjB97M / f rf /   KjUEfDuxU / nsb6APBwD / llsn / UycwDTQt1443 / 9MGSdCqA4eUXxK0Wv6P917xed7hJc8   m6Uw7A922O1 / 90MOtGXaweWXA8OXnwINKXAtSe1dzvGWcQManND9nzIZBU434MjZ / 1n45zP7gVMVOPX2v1ugCZxowHnp / 2wBl4tJ4CwFzm7 / DwvEwCkGNND   vwzQBI5XoI32 / 1CAAUcb0Er7fxggBg41oKH2 / 2WAJnCcAg3Wf / rU4HEABv   Xmqw / Aw6zsq3x7xEB0596wBEStFt / Boxefwbsb0Br27 / XBJie2w7u60Dr9WfA6PVnwJ4GtDz / PbPAXmAvB / qov0lw9PozYB8Dern / pyyQAts70Ojrv8 / of33mfYHNB

2 个答案:

答案 0 :(得分:2)

有两个不同的问题:

  1. +字符似乎已被空格替换。如果您提交application/x-www-form-urlencoded请求而没有转义+字符的百分比,则会发生这种情况。这可能发生在您第一次发送base64字符串以存储在数据库中时。

    有关百分比编码模式的讨论,请参阅https://stackoverflow.com/a/24888789/1271826。这里的关键点是不依赖stringByAddingPercentEscapesUsingEncoding,因为这样可以使+字符无法转义。

  2. 该字符串也缺少尾随的=个字符。 (字符串的长度应该是四的倍数,在这种情况下,它的两个字符很短,所以在{{1}的再现结尾处应该有==它中的字符("之前的#34;字符串)。虽然这有时是由设计不佳的base64编码器造成的错误,但这不是+遭受的问题。

    在这种情况下,它看起来像一个更长的base64字符串必须以某种方式被截断。 (你的字符串可疑地接近1024个字符。哈哈。)如果你把参数放在URL而不是请求的主体中,就会发生这种截断。但是此代码示例中没有任何内容可以解释此行为,因此问题在其他地方存在。

    但请查看原始base64EncodedStringWithOptions的{​​{1}}。 base64字符串应该比它大1/3(加上四舍五入到最接近的四个字符,一旦包含尾随的length字符)。

    并且,一旦解码了您提供的字符串并查看实际内容,您还可以看到base64字符串被截断。 (根据提供的部分,应该有1484个字节的NSData数据,而且没有,加上没有=块......不用担心关于这些细节,但请放心,它基本上说PNG数据流不完整。)

答案 1 :(得分:0)

如果您返回nil,那么您的base64字符串无效。 NSData(base64EncodedString:options:)需要一个base64字符串,其填充= = 4的倍数。

这是一个类似的问题(Obj-C除外)。 NSData won't accept valid base64 encoded string