我有一个包含几百个字节和一些Int32值的字符串。我想将这些写入文件,逐字。
我尝试了许多建议的解决方案,没有一个对我有用。我在文件中得到了无关的括号或空格或逗号。
有人可以建议一个简单,可靠的解决方案吗?
我认为我的问题很清楚,但在阅读完评论后,我对其进行了简化。
我如何撰写和/或追加" 12345"到文件,以便该文件包含以下十六进制值:3132333435?
通过编写NSData字符串,我可以获得的最佳结果是< 3132333435>。
我可以使用此链接获得所需的结果:Does swift have a protocol for writing a stream of bytes?,但我无法将数据附加到我创建的文件中。
答案 0 :(得分:3)
我建议使用NSFileHandle。
我测试过这样的。我开始使用包含单词“testing”的文件〜/ Desktop / test.txt 。然后我运行了这段代码:
let s = "12345"
let d = s.dataUsingEncoding(NSASCIIStringEncoding)!
let path = ("~/Desktop/test.txt" as NSString).stringByExpandingTildeInPath
if let fh = NSFileHandle(forWritingAtPath: path) {
fh.seekToEndOfFile()
fh.writeData(d)
fh.closeFile()
}
结果是文件现在包含
testing12345
十六进制转储显示基础字节为:
74 65 73 74 69 6E 67 31 32 33 34 35
我相信这就是你想要达到的目标。
另外,还有一个意见:
我可以获得的最佳结果是
<3132333435>
这听起来好像问题只是你不知道如何读取控制台输出。 <
和>
实际上不在文件中;它们只是数据控制台表示的一部分。最好使用BBEdit / TextWrangler或专用的十六进制转储程序来查看文件的实际字节。
答案 1 :(得分:1)
基本上问题是将数据正确转换为指针以将其转换为NSOutputStream.write
。以下扩展应该满足您的需求:
extension NSOutputStream {
enum WriteErrors : ErrorType {
case UTF8ConversionFailed
}
func write(string:String) throws -> Int {
guard let data = string.dataUsingEncoding(NSUTF8StringEncoding) else {
throw WriteErrors.UTF8ConversionFailed
}
return write(UnsafePointer(data.bytes), maxLength: data.length)
}
func write(var i:Int32) throws -> Int {
return withUnsafePointer(&i) {
self.write(UnsafePointer($0), maxLength: sizeof(Int32))
}
}
}
请注意,将原始二进制数据写入文件是不明智的,您应该首先标准化字节顺序,但我将其留作读者练习。