swift 将 UInt8 数组的一部分包装为强的正确方法是什么?

我有一些原始数据处理要在 iPhone 应用程序中进行。字符串总是来自一个非常大的底层字节数组,所以我希望能够从数组中提取字符串而不会触发内存不足问题。

我可以String(bytesNoCopy: ...)在文档中看到一个,这是我想要的,以及它应该如何使用。假设调用了一个uint8 数组,data并且x是一个数字,显示字符串在数组内的位置。

func readString(_ data:inout [UInt8], _ x:inout Int)  -> String {
    // Read string length out of data array
    let l = Int(readUInt8(&data, &x))
    x = x + 1

    // Read string out of data array without copy
    let s = String(
        bytesNoCopy: UnsafeMutableRawPointer, // <-- what goes here??
        length: l,
        encoding: .utf8,
        freeWhenDone: false)
    if s == nil {
        return ""
    }
    return s!
}
塔伦泰吉

你可以这样做 -

func readString(_ data:inout [UInt8], _ x:inout Int)  -> String {
    // Read string length out of data array
    let l = Int(readUInt8(&data, &x))
    x = x + 1

    // Read string out of data array without copy
    let dataPointer: UnsafeMutablePointer<UInt8> = UnsafeMutablePointer(mutating: data)
    
    let s = String(
        bytesNoCopy: dataPointer, // UNSAFE UNSAFE UNSAFE
        length: l,
        encoding: .utf8,
        freeWhenDone: false)
    if s == nil {
        return ""
    }
    return s!
}

警告

UnsafeMutableRawPointer

UnsafeMutableRawPointer类型不提供自动内存管理、类型安全和对齐保证。您负责通过不安全指针处理您使用的任何内存的生命周期,以避免泄漏或未定义的行为。

您手动管理的内存可以是无类型的或绑定到特定类型的。您使用该UnsafeMutableRawPointer类型来访问和管理内存中的原始字节,无论该内存是否已绑定到特定类型。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章