2016-01-07 4 views
0

В папке моих документов приложения у меня есть файл, который я пытаюсь прочитать byte-by-byte в массив из UInt8, где каждый элемент представляет собой байт. Как мне это сделать? Файл называется Q1.dat.Как читать файл в массив Ints

Вот моя неудачная попытка:

func readArray() -> [Int]? { 
    if let arrayPath: String = createArrayPath() { 
     if let arrayFromFile: [Int] = NSArray(contentsOfFile: arrayPath) as? [Int] { 
      return arrayFromFile 
     } 
    } 
    return nil 
} 

func createArrayPath() -> String? { 
    if let docsPath: String = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).last { 
     return ((docsPath as NSString).stringByAppendingPathComponent("Q1") as NSString).stringByAppendingPathExtension("dat") 
    } 
    return nil 
} 
+1

Одним из требований, предъявляемых к публикации надлежащего вопроса о SO является то, что вы предоставите ваши лучшие попытки в коде , Не могли бы вы обновить код? Кроме того, просмотрите [ask]. –

+0

это помогает? http://stackoverflow.com/questions/24581517/read-a-file-url-line-by-line-in-swift –

+0

Вы хотите массив из 1s и 0s или массив байтов? –

ответ

1

попробовать что-то вроде этого:

let filePath = "/Path/To/Directory/Q1.dat" 

var bytes = [UInt8]() 

if let data = NSData(contentsOfFile: filePath) { 

    var buffer = [UInt8](count: data.length, repeatedValue: 0) 
    data.getBytes(&buffer, length: data.length) 
    bytes = buffer 
} 

Я сожалею, я не в том месте, где я могу проверить, но с небольшим возиться он должен дать вам массив из UInt8 s, каждый из которых представляет собой байт из файла.

EDIT: И если вы действительно хотите, чтобы это массив Int с вместо UInt8 с, просто mapbytes на массив Int с:

let intBytes = bytes.map { Int($0) } 

... хотя, вообще говоря, это не ясно, почему вы хотите работать с чем угодно, кроме набора байтов, которые наиболее предпочтительно представлены в виде серии UInt8.

И если вы действительно, действительно, хотите единицы и нули, то лавируя это до конца должен сделать это:

var onesAndZeros = [UInt8]() 

bytes.forEach { byte in 

    var array = [UInt8](count: 8, repeatedValue: 0) 

    let bits = String(byte, radix: 2).characters.flatMap { UInt8(String($0)) } 

    array.replaceRange((8-bits.count)..<8, with: bits) 
    onesAndZeros.appendContentsOf(array) 
} 

Опять же, я пошел с UInt8 вместо Int, только потому, что она делает более но изменить его, как вам нужно.

Просто обметать вещи, вы можете обернуть две операции в паре функций, как это:

func bytesFromFile(filePath: String) -> [UInt8]? { 

    guard let data = NSData(contentsOfFile: filePath) else { return nil } 

    var buffer = [UInt8](count: data.length, repeatedValue: 0) 
    data.getBytes(&buffer, length: data.length) 

    return buffer 
} 

func bitsFromBytes(bytes: [UInt8]) -> [UInt8] { 

    var onesAndZeros = [UInt8]() 

    bytes.forEach { byte in 

     var array = [UInt8](count: 8, repeatedValue: 0) 

     let bits = String(byte, radix: 2).characters.flatMap { UInt8(String($0)) } 

     array.replaceRange((8-bits.count)..<8, with: bits) 
     onesAndZeros.appendContentsOf(array) 
    } 

    return onesAndZeros 
} 
+0

'let intBytes = bytes.map {Int ($ 0)}' преобразует каждый отдельный байт в целое число и не принимает 4 байта для формирования одного UInt32. –

Смежные вопросы