Swift - 将字节流写入文件

时间:2016-03-20 23:21:07

标签: swift file bytestream

我有一个包含几百个字节和一些Int32值的字符串。我想将这些写入文件,逐字。

我尝试了许多建议的解决方案,没有一个对我有用。我在文件中得到了无关的括号或空格或逗号。

有人可以建议一个简单,可靠的解决方案吗?

我认为我的问题很清楚,但在阅读完评论后,我对其进行了简化。

我如何撰写和/或追加" 12345"到文件,以便该文件包含以下十六进制值:3132333435?

通过编写NSData字符串,我可以获得的最佳结果是< 3132333435>。

我可以使用此链接获得所需的结果:Does swift have a protocol for writing a stream of bytes?,但我无法将数据附加到我创建的文件中。

2 个答案:

答案 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))
        }
    }
}

请注意,将原始二进制数据写入文件是不明智的,您应该首先标准化字节顺序,但我将其留作读者练习。