尝试这样的事情:
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,每个代表文件中的一个字节。
编辑:如果你真的希望这是一个数组Int
s 而不是UInt8
s, just map
bytes
到一个数组Int
s:
let intBytes = bytes.map { Int($0) }
...尽管一般来说,不清楚为什么要使用字节集合以外的任何内容,字节集合最适合表示为一系列UInt8
s.
如果你真的真的想要这些 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
}