如何将文件读入整数数组

3

我在我的应用程序文档文件夹中有一个文件,我正在尝试将其逐字节读入一个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
在SO上发布一个合适的问题的要求之一是提供你在代码方面的最佳尝试。你能否请更新并附上代码?另外,请查看[ask]。 - Dan Beaulieu
你想要一个由1和0组成的数组还是一个字节的数组? - Aaron Rasmussen
文件是如何创建的? - Adam
@Adam 这是用C++编写的,但我认为这并不重要,因为我只是读取位。从实际目的来看,它可以是一个mp4文件。 - Lahav
2
你想让每个Int包含文件中的一个字节吗? - Marc Khadpe
显示剩余2条评论
1个回答

7

试试这样做:

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数组,只需将bytes映射到一个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
}

let intBytes = bytes.map { Int($0) } 将每个单独的字节转换为整数,并不需要将4个字节组合成一个UInt32。 - qwerty_so

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接