Конвертировать массив байтов в Int64 в Swift 5 - PullRequest
0 голосов
/ 03 июня 2019

Я обрабатываю различные массивы UInt8 (little-endian) и мне нужно конвертировать их в 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 ]

3 голосов
/ 03 июня 2019

В качестве альтернативы вы можете вычислить число путем повторного сдвига и добавления, как предлагается в комментариях:

let array: [UInt8] = [13, 164, 167, 80, 4, 0]
let raw = array.reversed().reduce(0) { $0 << 8 + UInt64($1) }
print(raw) // 18533032973
2 голосов
/ 03 июня 2019

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)
...