在 Swift 5 中将字节数组转换为 Int64
Convert array of bytes to Int64 in Swift 5
我正在处理各种 UInt8(小端)数组,需要将它们转换为 Int64。
在 Swift 4 中我使用了
let array: [UInt8] = [13,164,167,80,4,0]
let raw = Int64(littleEndian: Data(array).withUnsafeBytes { [=11=].pointee })
print(raw) //18533032973
效果很好。但是在 Swift 5 中不推荐使用这种方式,所以我切换到
let array: [UInt8] = [13,164,167,80,4,0]
let raw = array.withUnsafeBytes { [=12=].load(as: Int64.self) }
print(raw)
给出错误信息:
Fatal error: UnsafeRawBufferPointer.load out of bounds
在 Swift 5 中是否有一种方法可以转换它,而无需在转换工作之前用额外的 0 填充数组?
谢谢!
withUnsafeBytes { [=12=].load
仅当数组恰好包含 64 位(8 字节)时有效,例如
let array: [UInt8] = [13,164,167,80,4,0,0,0]
let raw = array.withUnsafeBytes { [=10=].load(as: Int64.self) }
print(raw)
您可以使用 6 字节数组
var raw : Int64 = 0
withUnsafeMutableBytes(of: &raw, { array.copyBytes(to: [=11=])} )
print(raw)
或者,您可以按照评论中的建议,通过重复移位和相加来计算数字:
let array: [UInt8] = [13, 164, 167, 80, 4, 0]
let raw = array.reversed().reduce(0) { [=10=] << 8 + UInt64() }
print(raw) // 18533032973
我正在处理各种 UInt8(小端)数组,需要将它们转换为 Int64。 在 Swift 4 中我使用了
let array: [UInt8] = [13,164,167,80,4,0]
let raw = Int64(littleEndian: Data(array).withUnsafeBytes { [=11=].pointee })
print(raw) //18533032973
效果很好。但是在 Swift 5 中不推荐使用这种方式,所以我切换到
let array: [UInt8] = [13,164,167,80,4,0]
let raw = array.withUnsafeBytes { [=12=].load(as: Int64.self) }
print(raw)
给出错误信息:
Fatal error: UnsafeRawBufferPointer.load out of bounds
在 Swift 5 中是否有一种方法可以转换它,而无需在转换工作之前用额外的 0 填充数组?
谢谢!
withUnsafeBytes { [=12=].load
仅当数组恰好包含 64 位(8 字节)时有效,例如
let array: [UInt8] = [13,164,167,80,4,0,0,0]
let raw = array.withUnsafeBytes { [=10=].load(as: Int64.self) }
print(raw)
您可以使用 6 字节数组
var raw : Int64 = 0
withUnsafeMutableBytes(of: &raw, { array.copyBytes(to: [=11=])} )
print(raw)
或者,您可以按照评论中的建议,通过重复移位和相加来计算数字:
let array: [UInt8] = [13, 164, 167, 80, 4, 0]
let raw = array.reversed().reduce(0) { [=10=] << 8 + UInt64() }
print(raw) // 18533032973