如何将 Swift 中的 Float 数组保存为 txt 文件
How to save a Float array in Swift as txt file
首先:我真的很想将数组保存为 .txt
文件。 .plist
是不行的。
原因:之后我想用C++把它保存到一个vector中。用包装纸意识到这一点已经让我发疯了。
这是我的代码:
guard let buf = AVAudioPCMBuffer(pcmFormat: format!, frameCapacity: AVAudioFrameCount(file.length))
else{ throw NSError()}
try file.read(into: buf)
guard buf.floatChannelData != nil else{print("Channel Buffer konnte nicht erstellt werden")
throw NSError()}
let samples = Array(UnsafeBufferPointer(start:buf.floatChannelData![0],count:Int(buf.frameLength)))
var wData = Data(samples)
try! wData.write(to: outputURL())
但是无法用 Float 值初始化数据,是吗?
如何将浮点值数组写入 .txt
文件?
问题本身的答案(保存为 txt),您可以将浮点数数组保存为 JSON 字符串。使用 JSONEncoder/JSONDecoder.
对其进行编码和解码应该非常简单
let values: [Float] = [-.pi, .zero, .pi, 1.5, 2.5]
let encoded = try! JSONEncoder().encode(values)
print(String(data: encoded, encoding: .utf8)!) // "[-3.1415925025939941,0,3.1415925025939941,1.5,2.5]\n"
let decoded = try! JSONDecoder().decode([Float].self, from: encoded) // [-3.141593, 0, 3.141593, 1.5, 2.5]
“但是无法用浮点值初始化数据,是吗?”
是的,如果绝对可以将浮点数组转换为 Data/Bytes 并读回。最好保留准确的值,避免转换为字符串:
extension Array {
var bytes: [UInt8] { withUnsafeBytes { .init([=11=]) } }
var data: Data { withUnsafeBytes { .init([=11=]) } }
}
extension ContiguousBytes {
func object<T>() -> T { withUnsafeBytes { [=11=].load(as: T.self) } }
func objects<T>() -> [T] { withUnsafeBytes { .init([=11=].bindMemory(to: T.self)) } }
}
let values: [Float] = [-.pi, .zero, .pi, 1.5, 2.5]
let bytes = values.bytes // [218, 15, 73, 192, 0, 0, 0, 0, 218, 15, 73, 64, 0, 0, 192, 63, 0, 0, 32, 64]
let data = values.data // 20 bytes
let minusPI: Float = data.subdata(in: 0..<4).object() // -3.141593
let loaded1: [Float] = bytes.objects() // [-3.141593, 0, 3.141593, 1.5, 2.5]
let loaded2: [Float] = data.objects() // [-3.141593, 0, 3.141593, 1.5, 2.5]
首先:我真的很想将数组保存为 .txt
文件。 .plist
是不行的。
原因:之后我想用C++把它保存到一个vector中。用包装纸意识到这一点已经让我发疯了。
这是我的代码:
guard let buf = AVAudioPCMBuffer(pcmFormat: format!, frameCapacity: AVAudioFrameCount(file.length))
else{ throw NSError()}
try file.read(into: buf)
guard buf.floatChannelData != nil else{print("Channel Buffer konnte nicht erstellt werden")
throw NSError()}
let samples = Array(UnsafeBufferPointer(start:buf.floatChannelData![0],count:Int(buf.frameLength)))
var wData = Data(samples)
try! wData.write(to: outputURL())
但是无法用 Float 值初始化数据,是吗?
如何将浮点值数组写入 .txt
文件?
问题本身的答案(保存为 txt),您可以将浮点数数组保存为 JSON 字符串。使用 JSONEncoder/JSONDecoder.
对其进行编码和解码应该非常简单let values: [Float] = [-.pi, .zero, .pi, 1.5, 2.5]
let encoded = try! JSONEncoder().encode(values)
print(String(data: encoded, encoding: .utf8)!) // "[-3.1415925025939941,0,3.1415925025939941,1.5,2.5]\n"
let decoded = try! JSONDecoder().decode([Float].self, from: encoded) // [-3.141593, 0, 3.141593, 1.5, 2.5]
“但是无法用浮点值初始化数据,是吗?”
是的,如果绝对可以将浮点数组转换为 Data/Bytes 并读回。最好保留准确的值,避免转换为字符串:
extension Array {
var bytes: [UInt8] { withUnsafeBytes { .init([=11=]) } }
var data: Data { withUnsafeBytes { .init([=11=]) } }
}
extension ContiguousBytes {
func object<T>() -> T { withUnsafeBytes { [=11=].load(as: T.self) } }
func objects<T>() -> [T] { withUnsafeBytes { .init([=11=].bindMemory(to: T.self)) } }
}
let values: [Float] = [-.pi, .zero, .pi, 1.5, 2.5]
let bytes = values.bytes // [218, 15, 73, 192, 0, 0, 0, 0, 218, 15, 73, 64, 0, 0, 192, 63, 0, 0, 32, 64]
let data = values.data // 20 bytes
let minusPI: Float = data.subdata(in: 0..<4).object() // -3.141593
let loaded1: [Float] = bytes.objects() // [-3.141593, 0, 3.141593, 1.5, 2.5]
let loaded2: [Float] = data.objects() // [-3.141593, 0, 3.141593, 1.5, 2.5]