如何将文件读入整数数组
How to read file into array of Ints
在我的应用程序文档文件夹中,我有一个文件,我试图将每个字节读入一个 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
}
尝试这样的事情:
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
s 的数组而不是 UInt8
s,只需 map
bytes
到 Int
s:
let intBytes = bytes.map { Int([=11=]) }
...尽管一般来说,不清楚为什么要使用字节集合以外的任何东西,字节集合最适合表示为一系列 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([=12=])) }
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([=13=])) }
array.replaceRange((8-bits.count)..<8, with: bits)
onesAndZeros.appendContentsOf(array)
}
return onesAndZeros
}
在我的应用程序文档文件夹中,我有一个文件,我试图将每个字节读入一个 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
}
尝试这样的事情:
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
s 的数组而不是 UInt8
s,只需 map
bytes
到 Int
s:
let intBytes = bytes.map { Int([=11=]) }
...尽管一般来说,不清楚为什么要使用字节集合以外的任何东西,字节集合最适合表示为一系列 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([=12=])) }
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([=13=])) }
array.replaceRange((8-bits.count)..<8, with: bits)
onesAndZeros.appendContentsOf(array)
}
return onesAndZeros
}