代码之家  ›  专栏  ›  技术社区  ›  user2844801

Swift中使用UnsafeMutablePointer编码和解码字符串

  •  0
  • user2844801  · 技术社区  · 11 年前

    我在将字符串转换为UnsafeMutablePointers和从UnsafeMatablePointers转换字符串时遇到问题。以下代码不起作用,返回了错误的字符串。

    // func rfcommChannelData(rfcommChannel: IOBluetoothRFCOMMChannel!, data dataPointer: UnsafeMutablePointer<Void>, length dataLength: Int)
    func receivingData(data dataPointer: UnsafeMutablePointer<Void>, length dataLength: Int) {
        let data = NSData(bytes: dataPointer, length: dataLength)
        println("str = \(NSString(data: data, encoding: NSASCIIStringEncoding))")
    }
    
    // - (IOReturn)writeSync:(void *)data length:(UInt16)length;
    func sendingData(data: UnsafeMutablePointer<Void>, length: UInt16) {
        receivingData(data: data, length: Int(length))
    }
    
    
    var str: NSString = "Hello, playground"
    var data = str.dataUsingEncoding(NSASCIIStringEncoding)!
    var bytes = data.bytes
    
    sendingData(&bytes, UInt16(data.length))
    

    操场文件的链接是 here 。如果有人有在Swift中使用UnsafeMutablePointers处理字符串的经验,我将非常感谢一些指导,因为我在过去几天里没有取得任何进展。再次感谢!

    1 回复  |  直到 11 年前
        1
  •  0
  •   Martin R    11 年前

    具有

    var bytes = data.bytes
    sendingData(&bytes, UInt16(data.length))
    

    传递变量的地址 bytes 因此您看到的是用于表示该指针的字节。

    你可能想要的是

    let str = "Hello, playground"
    let data = str.dataUsingEncoding(NSASCIIStringEncoding)!
    sendingData(UnsafeMutablePointer(data.bytes), UInt16(data.length))
    

    将指针传递给数据字节。

    你还应该考虑 使用 NSUTF8StringEncoding 相反,因为转换为 NSASCIIStringEncoding 可能会失败。

    推荐文章