如何将文件读入Ints数组

时间:2016-01-07 18:33:19

标签: arrays swift bits

在我的app documents文件夹中,我有一个文件,我试图将每字节字节读入UInt8数组,其中每个元素代表一个字节。我该怎么做呢?该文件恰好称为Q1.dat。

这是我未成功的尝试:

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 个答案:

答案 0 :(得分: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的数组,每个数组代表文件中的一个字节。

编辑:如果你真的希望这是一个Int而不是UInt8的数组,只需map bytes到一个{{1}的数组} S:

Int

...虽然一般来说不清楚为什么你要使用除字节集合以外的任何东西,这些字节集最适合表示为一系列let intBytes = bytes.map { Int($0) } s。

如果你真的,真的,想要那些零和零,那么直到最后应该这样做:

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