Ios7 NSMutableData需要在Swift中转换为CConstPointer
从Objective-C重写以下Swift代码(将字节写入流):Ios7 NSMutableData需要在Swift中转换为CConstPointer,ios7,swift,Ios7,Swift,从Objective-C重写以下Swift代码(将字节写入流): var outputStream : NSOutputStream = NSOutputStream() var pData : NSMutableData = NSMutableData() var pType : Int = 1 let pMessage : String = "Device_Description\0\0\x01" // 16BitChar with escapeSequence var pLength :
var outputStream : NSOutputStream = NSOutputStream()
var pData : NSMutableData = NSMutableData()
var pType : Int = 1
let pMessage : String = "Device_Description\0\0\x01" // 16BitChar with escapeSequence
var pLength : Int = 8+pMessage.lengthOfBytesUsingEncoding(NSUTF16LittleEndianStringEncoding)
pData.appendBytes(&pLength, length: 4)
pData.appendBytes(&pType, length: 4)
pData.appendData((pMessage as NSString).dataUsingEncoding(NSUTF16LittleEndianStringEncoding))
outputStream.write(pData.bytes, maxLength: pData.length)
pData.bytes
属于COpaquePointer
类型,但写入操作需要CConstPointer
。有关于正确转换的提示吗?提前感谢。来自Swift&Objc互操作手册部分:
C常量指针
当函数声明为接受CConstPointer参数时,
它可以接受以下任何一项:
- nil,作为空指针传递
- CMutablePointer、CMutableVoidPointer、CConstPointer、CConstVoidPointer或AutoreleasingUnsafePointer值,这些值
如有必要,将转换为CConstPointer - 一种输入输出表达式,其操作数是类型为的左值,作为左值的地址传递
- 类型[]值,作为指向数组开头的指针传递,并在调用期间延长生存期
var p: [Uint8] = []
pData.getBytes(&p)
outputStream.write(p, maxLength: pData.length)
我现在通过使用
UnsafePointer()
,找到了一个简单的解决方案:
var outputStream:NSOutputStream=NSOutputStream()
var pData:NSMutableData=NSMutableData()
变量类型:Int=1
让pMessage:String=“Device\u Description\0\0\x01”//16位字符带转义序列
var pLength:Int=8+pMessage.LengthofBytes使用编码(NSUTF16LittleEndianStringCodeing)
pData.appendBytes(&plungth,长度:4)
pData.appendBytes(&p类型,长度:4)
pData.appendData(ptpMessage.dataUsingEncoding(nsutf16littleendianstringecoding))
outputStream.write(非安全指针(pData.bytes),maxLength:pData.length)
@谢谢你的意见。我知道这个解决方案不是很快,但它目前正在工作。正如Jack wu所概述的,但有些不完整,以下代码的工作原理与使用UnsafePointer选项相同:
var byteData = [UInt8]()
pData.getBytes(&byteData)
self.outputStream!.write(byteData, maxLength: pData.length)
你可能需要完全颠倒逻辑。。。首先,您应该使用
CConstPointer
为流创建一个缓冲区,然后您可以初始化NSData
将该缓冲区传递给它。这种逻辑比你尝试过的方式更接近斯威夫特的精神。你认为猜测是你的盟友吗?给出的4行代码充满了语法和逻辑错误。。。。
var byteData = [UInt8]()
pData.getBytes(&byteData)
self.outputStream!.write(byteData, maxLength: pData.length)