Swift - 将字节流写入文件
Swift - writing a byte stream to file
我有一个几百字节的字符串和一些 Int32 值。我想将这些逐字逐句地写入文件。
我尝试了很多建议的解决方案并且 none 对我有用。我在文件中得到无关的括号、空格或逗号。
任何人都可以提出一个简单、可靠的解决方案吗?
我以为我的问题很清楚,但是看了评论,我简化了。
如何编写 and/or 将“12345”附加到文件,以便文件包含以下十六进制值:3132333435?
通过编写 NSData 字符串,我可以获得的最佳结果是 <3132333435>。
我可以使用此 link 获得所需的结果:Does swift have a protocol for writing a stream of bytes?,但我无法将数据附加到我创建的文件中。
基本上,问题是将您的数据正确转换为指针以将其指向 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([=10=]), maxLength: sizeof(Int32))
}
}
}
请注意,将原始二进制数据写入文件是不明智的,您应该首先标准化字节顺序,但我将其留作 reader.
的练习。
我建议使用 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
我相信这就是你所说的你想要实现的目标。
另外,再补充一句:
The best result I can obtain is <3132333435>
这里听起来好像问题仅仅是您不知道如何读取控制台输出。 <
和 >
不在文件中;它们只是数据控制台表示的一部分。最好使用 BBEdit / TextW运行gler 或专用的十六进制转储器来查看文件的实际字节。
我有一个几百字节的字符串和一些 Int32 值。我想将这些逐字逐句地写入文件。
我尝试了很多建议的解决方案并且 none 对我有用。我在文件中得到无关的括号、空格或逗号。
任何人都可以提出一个简单、可靠的解决方案吗?
我以为我的问题很清楚,但是看了评论,我简化了。
如何编写 and/or 将“12345”附加到文件,以便文件包含以下十六进制值:3132333435?
通过编写 NSData 字符串,我可以获得的最佳结果是 <3132333435>。
我可以使用此 link 获得所需的结果:Does swift have a protocol for writing a stream of bytes?,但我无法将数据附加到我创建的文件中。
基本上,问题是将您的数据正确转换为指针以将其指向 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([=10=]), maxLength: sizeof(Int32))
}
}
}
请注意,将原始二进制数据写入文件是不明智的,您应该首先标准化字节顺序,但我将其留作 reader.
的练习。我建议使用 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
我相信这就是你所说的你想要实现的目标。
另外,再补充一句:
The best result I can obtain is
<3132333435>
这里听起来好像问题仅仅是您不知道如何读取控制台输出。 <
和 >
不在文件中;它们只是数据控制台表示的一部分。最好使用 BBEdit / TextW运行gler 或专用的十六进制转储器来查看文件的实际字节。