繁体   English   中英

将base64解码为uiimage iOS Swift

[英]Decode base64 to uiimage iOS Swift

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!)

在此处输入图片说明


在此处输入图片说明

我无法从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 / pyyQAts70Ojr V8 / of33mfYHNBeiq / t4X2L

从数据库中拉出时,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 / py yQAts70Ojrv8 / of33mfYHNB

有两个不同的问题:

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

    有关某些百分比编码模式的讨论,请参见https://stackoverflow.com/a/24888789/1271826 这里的关键点是不要依赖stringByAddingPercentEscapesUsingEncoding ,因为这将允许+字符不转义。

  2. 该字符串也缺少结尾的=字符。 (字符串的长度应该是四的倍数,在这种情况下,它是两个短字符,因此在演绎的末尾应该有== ,其中带有+字符(“ before”字符串)。有时是由于设计不佳的base64编码器导致的错误,这不是base64EncodedStringWithOptions遭受的问题。

    在这种情况下,看起来必须更长的base64字符串必须以某种方式被截断。 (您的字符串可疑地接近1024个字符。大声笑。)如果将参数放在URL中而不是请求的正文中,则可能会发生这种截断。 但是此代码示例中没有任何内容可以解释此行为,因此问题出在其他地方。

    但是请看原始NSDatalength base64字符串应比该字符串大1/3(加上尾随=字符后,四舍五入到最接近的四个字符)。

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

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

这是一个类似的问题(Obj-C中除外)。 NSData将不接受有效的base64编码的字符串

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM