2016-07-11 38 views
4

私のプロジェクトでバイト配列をUIImageに変換したいと思います。
私は何かを見つけましたhere
その後、私はそのコードを迅速に変換しようとしましたが失敗しました。Swiftのバイト配列をUIImageに変換

ここに私のコードの速いバージョンがあります。

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ではありません - Intに署名されています。負の数値を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'に変更しました。私は私の配列でIntに署名したので、UInt8を使用することはできません。 –

関連する問題