【问题标题】:Convert UnsafeMutableRawPointer to UInt64将 UnsafeMutableRawPointer 转换为 UInt64
【发布时间】:2019-03-23 11:53:47
【问题描述】:

我有一个 UnsafeMutableRawPointer 的实例,并且想要检索它的整数表示。我正在尝试使用以下代码:

let pointer : UnsafeMutableRawPointer? = address(of: self)
let intRepresentation : UInt64 = UInt64(bitPattern: pointer)

但是 Swift 编译器会抛出错误:“无法转换 'UnsafeMutableRawPointer?' 类型的值?到预期的参数类型'Int64'"

声明为 public init(bitPattern pointer: UnsafeMutableRawPointer?) 的构造函数是 Swift.Math.Integers.UInt 在同一个文件中也有public init(bitPattern x: Int64)

我怎样才能使这段代码工作或以任何其他方式(但不是太荒谬,如字符串解析)将 UnsafeMutableRawPointer 转换为整数?

【问题讨论】:

    标签: swift compiler-errors swift4


    【解决方案1】:

    (U)Int 在所有平台(32 位或 64 位)上都具有指针大小,因此您始终可以在 Unsafe(Mutable)(Raw)PointerIntUInt 之间进行转换:

    let pointer: UnsafeRawPointer? = ...
    let intRepresentation = UInt(bitPattern: pointer) 
    let ptrRepresentation = UnsafeRawPointer(bitPattern: intRepresentation)
    assert(ptrRepresentation == pointer)
    

    你的代码

    let intRepresentation = UInt64(bitPattern: pointer) 
    

    无法编译,因为UInt64 确实 not 有一个带指针参数的初始化程序,那是因为指针可以是 32 位或 64 位。 (即使在 64 位平台上,UIntUInt64 也是不同的类型。)

    如果你需要UInt64 那么

    let intRepresentation = UInt64(bitPattern:Int64(Int(bitPattern: pointer)))
    

    成功了。

    【讨论】:

    • 指针超过 Int 类型会怎样?它会默默地截断值或抛出某种异常? Int(bitPattern: ...) 对我来说已经足够好了,反正我在下一行返回 Int(truncatingIfNeeded: intRepresentation)
    • 好的,它永远不会超过 Int: /// 在 32 位平台上,Int 的大小与 Int32 相同, /// 在 64 位平台上,Int 是与Int64 大小相同。
    • @Krypt: Int 总是与指针大小相同,但Int 不一定与Int64 大小相同。
    • 嗯,唯一未解之谜是为什么原始代码无法编译?
    • @Krypt: Int(以及我刚刚注意到的UInt)有一个带有指针参数的初始化程序。但是UInt64 没有这样的初始化器。即使 UInt 和 UInt64 具有相同的大小,它们也是不同的类型。
    猜你喜欢
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-06
    • 1970-01-01
    • 1970-01-01
    • 2017-06-06
    • 1970-01-01
    相关资源
    最近更新 更多