Replace hex decoding closure with something safer and hopefully more performant

This commit is contained in:
2024-11-10 22:16:19 +11:00
parent e7fc47d640
commit 078397f451
3 changed files with 34 additions and 13 deletions

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