2016-07-11 6 views
4

Я хочу преобразовать массив байтов в UIImage в моем проекте.
Для этого я нашел что-то here.
После этого я попытался преобразовать этот код в быстрый, но не удалось.преобразовать массив байтов в 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: подписи, как показано в примере ниже Playground:

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 в моем массиве. –