试试这样做:
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
}