我有一个 UnsafeMutableRawPointer 实例,想要检索它的整数表示。我正在尝试使用以下代码:
let pointer : UnsafeMutableRawPointer? = address(of: self)
let intRepresentation : UInt64 = UInt64(bitPattern: pointer)
但是 Swift 编译器抛出错误:“无法转换‘UnsafeMutableRawPointer’类型的值?”预期参数类型“Int64””
声明为 public init(bitPattern point: UnsafeMutableRawPointer?)
的构造函数是 Swift.Math.Integers.UInt
它还在同一文件中具有 public init(bitPattern x: Int64)
我如何才能使此代码工作或以任何其他方式(但不是太荒谬,如字符串解析)将 UnsafeMutableRawPointer 转换为整数?
最佳答案
(U)Int
具有所有平台(32 位或 64 位)上指针的大小,因此您始终可以在 Unsafe(Mutable)(Raw)Pointer
之间进行转换和Int
或UInt
:
let pointer: UnsafeRawPointer? = ...
let intRepresentation = UInt(bitPattern: pointer)
let ptrRepresentation = UnsafeRawPointer(bitPattern: intRepresentation)
assert(ptrRepresentation == pointer)
你的代码
let intRepresentation = UInt64(bitPattern: pointer)
无法编译,因为 UInt64
没有有一个带有指针参数的初始化器,这是因为指针可以是 32 位或 64 位。 (即使在 64 位平台上,UInt
和 UInt64
也是不同的类型。)
如果您需要UInt64
那么
let intRepresentation = UInt64(bitPattern:Int64(Int(bitPattern: pointer)))
成功了。
关于swift - 将 UnsafeMutableRawPointer 转换为 UInt64,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55313453/