[Swift] Convertit un entier de type UInt64 en [UInt8]

Il y a deux façons d'aller sur Google.

extension UInt64{
    var uint8Array:[UInt8]{
        var x = self.bigEndian
        let data = Data(bytes: &x, count: MemoryLayout<UInt64>.size)
        return data.map{$0}
    }
    
    var uint8Array2:[UInt8]{
        var bigEndian:UInt64 = self.bigEndian
        let count = MemoryLayout<UInt64>.size
        let bytePtr = withUnsafePointer(to: &bigEndian) {
            $0.withMemoryRebound(to: UInt8.self, capacity: count) {
                UnsafeBufferPointer(start: $0, count: count)
            }
        }
        return Array(bytePtr)
    }
}

Vous obtiendrez le même résultat avec l'un ou l'autre. Comme c'est une bonne affaire, j'ai également comparé la vitesse.

func testPerformanceUInt64ToUInt8() throws{
    let data = (0..<1000000).map{_ in UInt64.random(in: 0..<UInt64.max)}
    self.measure {
        let uint8s = data.map{$0.uint8Array}
        print(uint8s.count)
    }
}

func testPerformanceUInt64ToUInt8_2() throws{
    let data = (0..<1000000).map{_ in UInt64.random(in: 0..<UInt64.max)}
    self.measure {
        let uint8s = data.map{$0.uint8Array2}
        print(uint8s.count)
    }
}
Test Case '[testPerformanceUInt64ToUInt8]' 
measured [Time, seconds] 
average: 0.176, 
relative standard deviation: 9.656%, 
values: [0.227525, 0.172769, 0.170525, 0.170571, 0.170574, 0.170578, 0.170615, 0.170248, 0.170302, 0.170817]

Test Case '[testPerformanceUInt64ToUInt8_2]' 
measured [Time, seconds] 
average: 0.101, 
relative standard deviation: 8.491%, 
values: [0.126460, 0.098508, 0.098236, 0.097850, 0.097855, 0.097873, 0.097932, 0.097878, 0.097662, 0.097690]

Le second semble être plus rapide. Je trouve que le premier moyen est plus facile à comprendre, mais si vous avez besoin de performances, vous devriez utiliser le second.

référence

Recommended Posts

[Swift] Convertit un entier de type UInt64 en [UInt8]
[Swift] Comment envoyer une notification
[Swift5] Comment créer un écran de démarrage
Conversion du pointeur de chaîne de langage C en type Swift String
Convertissez une chaîne en un tableau caractère par caractère avec Swift
Transition vers un contrôleur de vue avec Swift WebKit
java: Comment écrire une liste de types génériques [Note]
Élément 47: Préférez la collecte au flux comme type de retour
Je souhaite créer une annotation générique pour un type
[Swift] Type d'énumération de type partagé
Comment repousser la barre oblique \
Ajoutez un package Swift local à votre projet avec Swift PM
Comment écrire une migration du type Rails datetime au type date
Code du port C avec de nombreux typecasts vers Swift
J'ai essayé de convertir une chaîne de caractères en un type LocalDate en Java
Ajouter une ombre au bouton Swift (et aussi au cercle)