【问题标题】:Encoding/Decoding base64 decodedData = nil编码/解码 base64 decodedData = nil
【发布时间】:2015-12-11 16:28:28
【问题描述】:

昨天我为此写了一个工作代码,但我删除了它,当写一个新的时,事情真的很奇怪:

我是这样编码的:

let pictureData = UIImagePNGRepresentation(picture!)
let pictureToString64 = pictureData?.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.Encoding64CharacterLineLength)

(我之前有 JPEGRepresentation,但它不起作用,所以我尝试使用 JPEG) 我通过获取pic 64 以这种方式解码,我相信它具有正确的值。它以iVBORw0KGgoAAAANSUhEUgAAAUAA(...) 开头

 let decodedData = NSData(base64EncodedString: pic64, options:NSDataBase64DecodingOptions(rawValue: 0))
 let decodedImage = UIImage(data: decodedData!)
 let pictureDataLocal = UIImageJPEGRepresentation(decodedImage!, 100)
                defaults.setObject(pictureDataLocal, forKey: "profilePicture")

问题是 decodedData 总是 nil。 为什么会这样?

【问题讨论】:

    标签: ios swift uiimage base64 nsdata


    【解决方案1】:

    我认为这与NSDataBase64DecodingOptions有关。

    使用NSDataBase64DecodingOptions.IgnoreUnknownCharacters而不是NSDataBase64DecodingOptions(rawValue: 0),我能够将Base64编码的字符串解码回NSData,并根据该数据创建UIImage

    let picture = UIImage(named: "myImage")
    
    let pictureData = UIImagePNGRepresentation(picture!)
    
    let pictureToString64 = pictureData?.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.Encoding64CharacterLineLength)
    
    let decodedData = NSData(base64EncodedString: pictureToString64!, options:NSDataBase64DecodingOptions.IgnoreUnknownCharacters)
    let decodedImage = UIImage(data: decodedData!)
    let pictureDataLocal = UIImageJPEGRepresentation(decodedImage!, 100)
    

    NSDataBase64DecodingOptions 继承自 OptionSetType,这就是您获得 rawValue 初始化程序的原因。最好使用其中一种集合类型,而不是传入一个值。我在标题中看到 NSDataBase64DecodingOptions 是结构中唯一的公共 var,所以我尝试了一下。

    @available(iOS 7.0, *)
    public struct NSDataBase64DecodingOptions : OptionSetType {
        public init(rawValue: UInt)
    
        // Use the following option to modify the decoding algorithm so that it ignores unknown non-Base64 bytes, including line ending characters.
        public static var IgnoreUnknownCharacters: NSDataBase64DecodingOptions { get }
    }
    

    【讨论】:

    • rawValue 可以使用,但是,因为它是 BitwiseOperationsType,在没有元素类型集的情况下使用它会返回 nil。如果 rawValue 实际上有一个值(例如 1),那么它应该可以工作。
    • @PauloMartins 不客气!如果我的解决方案对您有所帮助,请不要忘记 accept my answer 向其他人展示它有所帮助。欢迎使用 Stack Overflow。
    • @JAL 当我获得 15 个声望时我不会忘记的 :)
    • @PauloMartins 接受不同于支持。您可以接受任何声望级别,并且您自己会因此获得两个声望值。
    猜你喜欢
    • 2016-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-07
    • 1970-01-01
    • 2018-07-25
    相关资源
    最近更新 更多