mirror of
https://github.com/GayPizzaSpecifications/darwin-apk.git
synced 2025-08-03 21:41:31 +00:00
Replace hex decoding closure with something safer and hopefully more performant
This commit is contained in:
32
Sources/apk/Utility/DataExtensions.swift
Normal file
32
Sources/apk/Utility/DataExtensions.swift
Normal file
@ -0,0 +1,32 @@
|
||||
/*
|
||||
* darwin-apk © 2024 Gay Pizza Specifications
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
import Foundation
|
||||
|
||||
extension Data {
|
||||
init?(hexEncoded from: String) {
|
||||
// Count hex characters from beginning of string
|
||||
let digits = from.count(where: \.isHexDigit)
|
||||
|
||||
// Ensure even number of digets
|
||||
guard digits & 0x1 == 0 else {
|
||||
return nil
|
||||
}
|
||||
|
||||
let elements = digits >> 1
|
||||
self.init(capacity: elements)
|
||||
|
||||
// Convert digits
|
||||
var idx = from.startIndex
|
||||
for _ in 0..<elements {
|
||||
let hi = from[idx].hexDigitValue!
|
||||
idx = from.index(after: idx)
|
||||
let lo = from[idx].hexDigitValue!
|
||||
idx = from.index(after: idx)
|
||||
let byte = UInt8(truncatingIfNeeded: lo + hi << 4)
|
||||
self.append(byte)
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user