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

Convert array of bytes to Int64 in Swift 5

提问人:Mike Nathas 提问时间:6/3/2019 最后编辑:Dávid PásztorMike Nathas 更新时间:6/3/2019 访问量:1863

问:

我正在处理 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 填充数组的情况下转换它,直到转换工作?

谢谢!

数组 swift int64 swift5

评论

1赞 jazz64 6/3/2019
传统的添加纯字节值,并在循环中转移怎么样?
1赞 OOPer 6/3/2019
Int64由 8 个字节组成,您需要明确给出缺失的 2 个字节。

答:

3赞 vadian 6/3/2019 #1

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)
4赞 Martin R 6/3/2019 #2

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

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