2016-07-11 52 views
4

我想在我的項目中將字節數組轉換爲UIImage
爲此我找到了一些東西here
之後,我試圖快速轉換該代碼,但失敗了。將字節數組轉換爲Swift中的UIImage

這是我的swift版本的代碼。

func convierteImagen(cadenaImagen: NSMutableString) -> UIImage { 
     var strings: [AnyObject] = cadenaImagen.componentsSeparatedByString(",") 
     let c: UInt = UInt(strings.count) 
     var bytes = [UInt8]() 
     for (var i = 0; i < Int(c); i += 1) { 
      let str: String = strings[i] as! String 
      let byte: Int = Int(str)! 
      bytes.append(UInt8(byte)) 
//   bytes[i] = UInt8(byte) 
     } 
     let datos: NSData = NSData(bytes: bytes as [UInt8], length: Int(c)) 
     let image: UIImage = UIImage(data: datos)! 
     return image 
    } 


但我發現了錯誤:

EXC_BAD_INSTRUCTION

其顯示在屏幕截圖如下。

EXC_BAD_INSTRUCTION

請幫助解決這個問題。

回答

3

如果您使用的是您引用的示例數據,那些值不是UInt s - 它們的簽名爲Int s。將負數傳遞給UInt8()確實會導致運行時崩潰 - 我原以爲它應該返回一個可選項。答案是使用bitPattern:簽名使用初始化器,如下圖所示的遊樂場例如:

let o = Int8("-127") 
print(o.dynamicType) // Optional(<Int8>) 
// It's optional, so we need to unwrap it... 
if let x = o { 
    print(x) // -127, as expected 
    //let b = UInt8(x) // Run time crash 
    let b = UInt8(bitPattern: x) // 129, as it should be 
} 

因此你的功能應該是

func convierteImagen(cadenaImagen: String) -> UIImage? { 
    var strings = cadenaImagen.componentsSeparatedByString(",") 
    var bytes = [UInt8]() 
    for i in 0..< strings.count { 
     if let signedByte = Int8(strings[i]) { 
      bytes.append(UInt8(bitPattern: signedByte)) 
     } else { 
      // Do something with this error condition 
     } 
    } 
    let datos: NSData = NSData(bytes: bytes, length: bytes.count) 
    return UIImage(data: datos) // Note it's optional. Don't force unwrap!!! 
} 
+0

感謝您的答覆。它真的幫助了我。我只是將代碼從'UInt8'更改爲'Int8',並且工作正常。我不能使用'UInt8',因爲我在我的數組中籤了Int。 –