C стиль указателя / массива приведен в Swift? - PullRequest
0 голосов
/ 10 марта 2020

Можно ли как-нибудь привести массив разных целочисленных размеров к другому типу массива?

Например, в C я могу сделать:

unsigned char byteArray[] = { 0x1, 0x5, 0xF, 0x3, 0xA5, 0x3, 0x8, 0x8, 0xAB };
unsigned long long *largeArray = (unsigned long long *)(byteArray);

, что сделать largeArray равным { 0x80803A5030F0501, 0x51B76EB7140024AB }.

Есть ли что-то подобное в Swift? Например, что-то вроде:

let byteArray: [UInt8] = [0x1, 0x5, 0xF, 0x3, 0xA5, 0x3, 0x8, 0x8, 0xAB]
let largeArray = [UInt64](byteArray)

Я знаю, что это можно сделать программно, мне просто было интересно, есть ли встроенный метод, прежде чем я углублюсь в создание своей собственной вещи, которая будет их кастовать.

Любая помощь будет принята с благодарностью!

1 Ответ

1 голос
/ 10 марта 2020

Предположим, что byteArray содержит восемь байтов. Вы можете сделать:

let byteArray: [UInt8] = [0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7]

let value = byteArray.withUnsafeBytes { 
    $0.bindMemory(to: UInt64.self)[0].littleEndian    // or .bigEndian
}

В результате:

0x0706050403020100     // or 0x0001020304050607 if you use bigEndian

Или, если у вас достаточно байтов для нескольких UInt64, вы можете сделать:

let longByteArray: [UInt8] = [
    0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7,
    0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf
]

let values = longByteArray.withUnsafeBytes {
    $0.bindMemory(to: UInt64.self)
}.map {
    $0.littleEndian       // or .bigEndian
}

В результате

[0x0706050403020100, 0x0f0e0d0c0b0a0908] // or [0x0001020304050607, 0x08090a0b0c0d0e0f] if you use bigEndian
...