如何从未安全的MutableRawPoter中获取字节?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (13)

如何从一个不安全的MutableRawPoter(SWIFT 3中的新版本)通过C API(核心音频等)传递给SWIFT函数所指向的内存中访问字节(或Int 16‘s、Floats等)。

提问于
用户回答回答于

load<T>从内存中读取原始字节并构造一个类型值T

let ptr = ... // Unsafe[Mutable]RawPointer
let i16 = ptr.load(as: UInt16.self)

可选地以字节偏移量:

let i16 = ptr.load(fromByteOffset: 4, as: UInt16.self)

假设指向的内存包含T类型的值,还有assumingMemoryBound()从a Unsafe[Mutable]RawPointer到a的转换Unsafe[Mutable]Pointer<T>

let i16 = ptr.assumingMemoryBound(to: UInt16.self).pointee

对于一组值可以创建一个“缓冲区指针”:

let i16bufptr = UnsafeBufferPointer(start: ptr.assumingMemoryBound(to: UInt16.self), count: count)

缓冲区指针可能已经足够用于你的目的,它可以自定义并且可以像数组一样枚举。如有必要,从缓冲区指针创建一个数组:

let i16array = Array(i16bufptr)

用户回答回答于

创造数据对象。

init(bytesNoCopy bytes: UnsafeMutableRawPointer, count: Int, deallocator: Data.Deallocator)

这里其他答案中缺少的一种重要方法是使用UnSecurityMutableRawPoter初始化数据对象。然后,数据对象可以用于其他计算。

public func base64(quality: Int32 = 67) -> String? {
    var size: Int32 = 0
    if let image = gdImageJpegPtr(internalImage, &size, quality) {
        // gdImageJpegPtr returns an UnsafeMutableRawPointer that is converted to a Data object
        let d = Data(bytesNoCopy: image, count: Int(size), deallocator: .none)
        return d.base64EncodedString()
    }
    return nil
}

扫码关注云+社区