将base64解码为uiimage iOS Swift

Decode base64 to uiimage iOS Swift

decodedData 为零,但我的 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 输出图像时遇到问题

base64 字符串在插入数据库之前进行编码:

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/of33mfYHNBeiq/t4X2L

从数据库下拉时的 base64 字符串解码:

Optional("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

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

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

有两个不同的问题:

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

    有关某些百分比编码模式的讨论,请参阅 。这里的关键点是不要依赖 stringByAddingPercentEscapesUsingEncoding,因为这将允许 + 个字符未转义。

  2. 该字符串还缺少结尾的 = 个字符。 (字符串的长度应该是四的倍数,在这种情况下,它是两个字符的短,所以在再现的末尾应该有 ==,其中包含 + 个字符("before" 字符串)。虽然这有时是设计不当的 base64 编码器所犯的错误,但这不是 base64EncodedStringWithOptions 遇到的问题。

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

    但是看看原来NSDatalength。 base64 字符串应该比它大 1/3(加上四舍五入到最接近的四个字符,一旦包含尾随 = 个字符)。

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