[Swift] Konvertiert eine Ganzzahl vom Typ UInt64 in [UInt8]

Es gibt zwei Möglichkeiten, wenn Sie googeln.

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

Sie erhalten mit beiden das gleiche Ergebnis. Da es ein gutes Geschäft ist, habe ich auch die Geschwindigkeit verglichen.

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]

Der zweite scheint schneller zu sein. Ich finde den ersten Weg leichter zu verstehen, aber wenn Sie Leistung benötigen, sollten Sie den zweiten verwenden.

Referenz

Recommended Posts

[Swift] Konvertiert eine Ganzzahl vom Typ UInt64 in [UInt8]
[Swift] So senden Sie eine Benachrichtigung
[Swift5] So erstellen Sie einen Begrüßungsbildschirm
Konvertiert vom String-Zeiger der C-Sprache zum Swift-String-Typ
Konvertieren Sie eine Zeichenfolge mit swift in ein zeichenweises Array
Übergang zu einem View Controller mit Swift WebKit
java: Wie schreibe ich eine generische Typliste? [Hinweis]
Punkt 47: Sammlung als Rückgabetyp dem Stream vorziehen
Ich möchte eine generische Anmerkung für einen Typ erstellen
[Swift] Aufzählungstyp für gemeinsam genutzte Typen
Wie man einen Schrägstrich zurückschlägt \
Fügen Sie Ihrem Projekt mit Swift PM ein lokales Swift-Paket hinzu
So schreiben Sie eine Migration vom Rails-Datums- / Uhrzeittyp zum Datumstyp
Port C-Code mit vielen Typecasts zu Swift
Ich habe versucht, in Java von einer Zeichenfolge in einen LocalDate-Typ zu konvertieren
Fügen Sie dem Swift-Button (und auch dem Kreis) einen Schatten hinzu.