swift - 使用扩展将数据转换为 UInt32
问题描述
我正在尝试为Data
类提供一个帮助方法来将字节转换为UInt32
. 到目前为止,这有效:
extension Data {
var uint32:UInt32 {
return UInt32(littleEndian: self.withUnsafeBytes { (ptr: UnsafePointer<UInt32>) in ptr.pointee })
}
}
自 swift 5 以来,编译器给出以下警告:
'withUnsafeBytes' is deprecated: use `withUnsafeBytes<R>(_: (UnsafeRawBufferPointer) throws -> R) rethrows -> R` instead`
经过一些研究,我尝试withUnsafeMutableBytes
与UnsafeMutablePointer<UInt32>
但这给出了一个错误:Cannot use mutating member on immutable value: 'self' is immutable
。(如果它不是不可变的 getter 函数的一部分,这将起作用)
如何修复我的只读辅助变量,以便编译器不发出警告?
(当然同样适用于UInt8
or UInt16
)
解决方案
尝试这个:
let data = Data([0x01,0x02,0x03,0x04])
extension Data {
var uint32:UInt32 {
return UInt32(littleEndian: self.withUnsafeBytes { bytes in
bytes.load(as: UInt32.self)
})
}
}
print(String(format: "%08X", data.uint32)) //->04030201
newwithUnsafeBytes
传了一个UnsafeRawBufferPointer
,里面有一个有用的方法load(as:)
。
推荐阅读
- javascript - 如何在网站上嵌入 Facebook 商店页面
- go - 在 golang 中退出 status 1
- python - 使用python Gurobi优化器及时均匀地安排事件
- android - 从同一项目中的 android 模块调用 Composable 函数
- python - Flask 返回 FileNotFoundError: [Errno 2] No such file or directory
- python - Python BeautifulSoup Scraper - apply function to each
- element in
- on page
- element in
- azure-iot-hub - IoT 中心部署清单:可以指定模块标识标签吗?
- operating-system - sleep() 函数完成后是否会导致定时器中断?
- com - 如何从 Microsoft.Office.Interop.Visio.DocumentsClass.Open 诊断 COMException“此文件名无效”
- c# - 如何确保 Microsoft.Interop.Excel.Workbook.SaveAs 使用 SSIS 变量以正确的文件名保存文本文件?