mirror of
				https://github.com/GayPizzaSpecifications/darwin-apk.git
				synced 2025-11-03 23:49:38 +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