在Swift 3中,如何从数据中获取非安全指针?

在Swift 3中,如何从数据中获取非安全指针?,swift,swift3,Swift,Swift3,根据Swift 3中的数据文档,我可以使用一个初始值设定项从指针创建数据。其实我需要的恰恰相反。我有一个数据,我想创建一个指向数据字节的指针。以下是我现在正在做的: 1. let data = <from some where> 2. let unsafePointer = UnsafeMutablePointer<UInt8>.allocate(capacity: data.count) 3. unsafePointer.initialize(to: 0, count:

根据Swift 3中的数据文档,我可以使用一个初始值设定项从指针创建数据。其实我需要的恰恰相反。我有一个数据,我想创建一个指向数据字节的指针。以下是我现在正在做的:

1. let data = <from some where>
2. let unsafePointer = UnsafeMutablePointer<UInt8>.allocate(capacity: data.count)
3. unsafePointer.initialize(to: 0, count: data.count) // is this necessary?
4. data.copyBytes(to: unsafePointer, count: data.count)
5. let unsafeRawPointer = unsafePointer.deinitialize() // this is of the type UnsafeMutalbleRawPointer, and I can use it where UnsafeRawPointer is needed.
1。让数据=
2.让unsafePointer=UnsafeMutablePointer.allocate(容量:data.count)
3.unsafePointer.initialize(to:0,count:data.count)//这是必需的吗?
4.data.copyBytes(to:unsafePointer,count:data.count)
5.让unsafeRawPointer=unsafePointer.deinitialize()//这是unsafeutalbrearwpointer类型,我可以在需要unsafeRawPointer的地方使用它。
我验证了这段代码在Xcode游戏场中有效。代码甚至可以在没有行号3的情况下工作。我不知道有没有这条线有什么区别。不管怎样,我的问题是,我做的对吗?有更简单的方法吗?

withUnsafeBytes()
提供指向字节的(键入的)指针, 可以将其转换为原始指针:

let data = <Data from somewhere>
data.withUnsafeBytes { (u8Ptr: UnsafePointer<UInt8>) in
    let rawPtr = UnsafeRawPointer(u8Ptr)
    // ... use `rawPtr` ...
}
现在指针在
nsData
有效的同一范围内有效

自Swift 5之日起

let data = <Data from somewhere>
data.withUnsafeBytes { rawBufferPointer in
    let rawPtr = rawBufferPointer.baseAddress!
    // ... use `rawPtr` ...
}
let数据=
data.withUnsafeBytes{rawBufferPointer in
让rawPtr=rawBufferPointer.baseAddress!
//…使用'rawPtr`。。。
}
因为闭包参数现在是一个
UnsafeRawBufferPointer

检查

我们找不到从
数据
检索
非安全指针
的方法或属性

因此,对于替代方案:

你可以这样写:

let data: Data = <initialize it as you like>

data.withUnsafeBytes {(uint8Ptr: UnsafePointer<UInt8>) in
    let rawPtr = UnsafeRawPointer(uint8Ptr)
    //`rawPtr` (and `uint8Ptr`) is guaranteed to be valid in this closure
    //...
    //You have no need manage `rawPtr`.
}
(您可以将
UnsafeMutableRawPointer
作为
deinitialize(count:)
的返回值获取,但该区域处于未初始化的状态,因此您不应访问该区域。)

在Swift 5中:

'withUnsafeBytes' is deprecated: use `withUnsafeBytes<R>(_: (UnsafeRawBufferPointer) throws -> R) rethrows -> R` instead
“withUnsafeBytes”不推荐使用:改用“withUnsafeBytes(:(UnsafeRawBufferPointer)throws->R)rethrrows->R”
一种可能的解决办法是:

buffer.withUnsafeBytes{ (bufferRawBufferPointer) -> Void in

    let bufferPointer: UnsafePointer<UInt8> = bufferRawBufferPointer.baseAddress!.assumingMemoryBound(to: UInt8.self)
    let rawPtr = UnsafeRawPointer(bufferPointer)
    //USE THE rawPtr

}
buffer.withUnsafeBytes{(bufferRawBufferPointer)->中的Void
让bufferPointer:UnsafePointer=bufferRawBufferPointer.baseAddress!.assumingmemorybind(to:UInt8.self)
设rawPtr=UnsafeRawPointer(缓冲指针)
//使用rawPtr
}

这些解决方案看起来比我的更好、更干净。第二个也是非常直接的。看来带unsafebytes的
是适合我的。它看起来比NSData更安全solution@ryantxr:
Data
是一个集合,您可以通过订阅直接访问它的字节,因此在许多情况下,您根本不需要withUnsafeBytes,只有在您希望将指针传递到C函数或进行一些“重新解释”转换时才需要。如果必须同时对多个数据对象执行此操作,则需要一个嵌套的
和unsafebytes
。强制转换选项非常好。只需使用NSData构造函数(Swift 3)而不是直接强制转换,这样->
NSData(data:data)
@algal::“对于不可变的数据对象,返回的指针在数据对象解除分配之前是有效的。对于可变的数据对象,返回的指针在数据对象解除分配或数据变异之前是有效的。”感谢两个解决方案。他们两个看起来都比我的好。你有没有办法用UnsafePointer代替UnsafePointer?不推荐的解决方案版本可能会出现这种情况。我认为不推荐的解决方案也可能出现这种情况。然而,我认为你的“诀窍”是用UInt8替换Int8。我的解决方案是将“bufferPointer”假定为UInt8类型。让我知道它是否有效@EmreTufekciYes它正在工作,我已经在使用不推荐的版本了,只是想知道它是否能与“非不推荐的”版本一起工作。但事实并非如此。谢谢你,雷蒙德。
'withUnsafeBytes' is deprecated: use `withUnsafeBytes<R>(_: (UnsafeRawBufferPointer) throws -> R) rethrows -> R` instead
buffer.withUnsafeBytes{ (bufferRawBufferPointer) -> Void in

    let bufferPointer: UnsafePointer<UInt8> = bufferRawBufferPointer.baseAddress!.assumingMemoryBound(to: UInt8.self)
    let rawPtr = UnsafeRawPointer(bufferPointer)
    //USE THE rawPtr

}