【问题标题】:How to read file into array of Ints如何将文件读入 Ints 数组
【发布时间】:2016-01-07 18:33:18
【问题描述】:

在我的应用程序文档文件夹中,我有一个文件,我试图将每个字节读取到 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
}

【问题讨论】:

  • 在 SO 上发布正确问题的要求之一是您在代码中提供最佳尝试。你能用代码更新吗?另外,请查看How to Ask
  • 你想要一个 1 和 0 的数组还是字节数组?
  • 文件是如何创建的?
  • 您希望每个 Int 包含文件中的单个字节吗?

标签: arrays swift bits


【解决方案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
}

对不起,我不在一个可以测试它的地方,但稍加修改它应该会给你一个 UInt8s 数组,每个数组代表文件中的一个字节。

编辑:如果你真的希望这是Ints 的数组而不是UInt8s,只需map bytesInts 的数组:

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

...虽然一般来说不清楚为什么要使用字节集合以外的任何东西,这些字节集合最恰当地表示为一系列UInt8s。

如果你真的,真的,想要 1 和 0,那么将它添加到最后应该可以做到:

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
}

【讨论】:

  • let intBytes = bytes.map { Int($0) } 将每个单个字节转换为整数,并且不需要 4 个字节即可形成单个 UInt32。
猜你喜欢
  • 2012-04-11
  • 1970-01-01
  • 2019-07-18
  • 2019-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多