2016-07-11 50 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。 –