在Swift 5中将字节数组转换为Int64

时间:2019-06-03 14:36:00

标签: arrays swift int64 swift5

我正在处理UInt8(小尾数)的各种数组,需要将它们转换为Int64。  在Swift 4中,我使用

let array: [UInt8] = [13,164,167,80,4,0]
let raw = Int64(littleEndian: Data(array).withUnsafeBytes { $0.pointee })
print(raw) //18533032973

效果很好。但是在Swift 5中,这种方式已被弃用,所以我切换到了

let array: [UInt8] = [13,164,167,80,4,0]
let raw = array.withUnsafeBytes { $0.load(as: Int64.self) }
print(raw)

给出错误消息:

  

致命错误:UnsafeRawBufferPointer.load超出范围

Swift 5中是否有一种方法可以在不转换数组的情况下将其转换为0,直到转换成功?

谢谢!

2 个答案:

答案 0 :(得分:3)

或者,您也可以按照注释中的建议,通过重复移位和相加来计算数字:

let array: [UInt8] = [13, 164, 167, 80, 4, 0]
let raw = array.reversed().reduce(0) { $0 << 8 + UInt64($1) }
print(raw) // 18533032973

答案 1 :(得分:2)

withUnsafeBytes { $0.load仅在数组仅包含64位(8字节)的情况下有效。

let array: [UInt8] = [13,164,167,80,4,0,0,0]
let raw = array.withUnsafeBytes { $0.load(as: Int64.self) }
print(raw)

您可以使用6字节数组

var raw : Int64 = 0
withUnsafeMutableBytes(of: &raw, { array.copyBytes(to: $0)} )
print(raw)