2017-02-22 18 views
0

Я должен вычислить контрольную сумму из выбранных файлов (изображения, видео)Рассчитайте видео файл md5 (хэш)

в моем расчете изображения коды, работающих большой, но видео расчета не работает вообще.

Я использую CryptoSwift

Вот мой код, что я сделал

import CryptoSwift 

class MD5Calculator { 

    static func imageChecksum(imageArray: [UIImage], onCalculated: @escaping ([String]) -> Void){ 

     DispatchQueue.global(qos: .userInitiated).async { 

      var array: [String] = []       
      for chosenImage in imageArray { 
       if let jpegData = UIImageJPEGRepresentation(chosenImage, 80) { 
        let checksum = jpegData.md5() 
        let chsum = checksum.toHexString() 
        array.append(chsum) 
       } 
      } 

      DispatchQueue.main.async { 
       onCalculated(array) 
      } 
     } 
    } 

    static func videoChecksum(videoURLs:[NSURL], onCalculated: @escaping ([String]) -> Void) { 
     DispatchQueue.global(qos: .userInitiated).async { 

      var array: [String] = [] 

      for url in videoURLs { 
       if let videoData = Data(contentsOf: url as URL, options: Data.ReadingOptions) { 
        let checksum = videoData.md5() 
        let chsum = checksum.toHexString() 
        array.append(chsum) 

       } 
      } 

      DispatchQueue.main.async { 
       onCalculated(array) 
      } 
     } 
    } 
} 

в videoChecksum я не могу получить данные у меня есть синтаксическая ошибка в строке

if let videoData = Data(contentsOf: url as URL, options: Data.ReadingOptions) 

Ошибка:

Cannot convert value of type 'Data.ReadingOptions.Type' (aka 'NSData.ReadingOptions.Type') to expected argument type 'Data.ReadingOptions' (aka 'NSData.ReadingOptions') 

И это класс данных Конструктор

public init(contentsOf url: URL, options: Data.ReadingOptions = default) throws 

Мой вопрос

1. как я могу получить данные о видеофайле

2. Если есть другой способ, чтобы получить данные и рассчитать контрольная сумма, пожалуйста, предложите мне

3. Если вы знаете, какую синтаксическую ошибку, пожалуйста, скажите мне, как это исправить.

ответ

2

Похоже, у вас есть ошибка синтаксиса при вызове

let videoData = Data(contentsOf: url as URL, options: Data.ReadingOptions) 

, так как параметр options ожидает один из ReadingOptions значений и вы передаете сам тип. Действительный вызов выглядит следующим образом:

let videoData = Data(contentsOf: url as URL, options: Data.ReadingOptions.uncached) 

(См official documentation возможные значения.)

Если вы не знаете о том, какое значение для обеспечения, вы можете опустить передать параметр, как это по умолчанию, то есть:

let videoData = Data(contentsOf: url as URL) 

Edit:
Также отметим, что Data(contentsOf:options:) инициализатор «throws» поэтому в идеале вы должны обернуть вызов в DO/попробуйте поймать заявление/как это:

for url in videoURLs { 
    do { 
     let videoData = try Data(contentsOf: url as URL) 
     let checksum = videoData.md5() 
     let chsum = checksum.toHexString() 
     array.append(chsum) 
    } catch { 
     // TODO: Handle error 
     print(error.localizedDescription) 
    } 
} 

Надеется, что это помогает.

+0

спасибо. Вы спасли мою жизнь. – fish40

+0

Рад слышать :) Также см. Мое редактирование об обработке исключений. – Olivier

0

Попробуйте

ALAssetRepresentation * респ = [defaultRepresentation активов]; Байт buffer = (Байт) malloc ((NSUInteger) rep.size); NSUInteger buffered = [rep getBytes: buffer fromOffset: 0.0 length: (NSUInteger) rep.ошибка размера: ноль]; NSData * data = [NSData dataWithBytesNoCopy: длина буфера: буферизированная freeWhenDone: YES];