taler-ios

iOS apps for GNU Taler (wallet)
Log | Files | Refs | README | LICENSE

Data+fromUInt8Array.swift (1431B)


      1 /*
      2  * This file is part of GNU Taler, ©2022-24 Taler Systems S.A.
      3  * See LICENSE.md
      4  */
      5 /**
      6  * @author Marc Stibane
      7  */
      8 import Foundation
      9 
     10 extension Data {
     11     init(fromUInt8Array inValues: [UInt8]) {
     12         let values = inValues
     13         self.init(bytes: values, count: values.count)
     14     }
     15 
     16     struct HexEncodingOptions: OptionSet {
     17         let rawValue: Int
     18         static let upperCase = HexEncodingOptions(rawValue: 1 << 0)
     19     }
     20 
     21     func hexEncodedString(options: HexEncodingOptions = []) -> String {
     22         let format = options.contains(.upperCase) ? "%02hhX" : "%02hhx"
     23         return self.map { String(format: format, $0) }.joined()
     24     }
     25 
     26     static func clampedData(_ data: Data, offset: UInt, size: UInt) -> Data {
     27         let count = UInt(data.count)
     28         // an offset at or past the end must yield nothing - clamping it to the last byte
     29         // would silently return unrelated data, and for empty data the clamp underflows
     30         guard offset < count else { return Data() }
     31         let start = data.startIndex + Int(offset)
     32         let end = start + Int(Swift.min(size, count - offset))
     33         return data[start..<end]
     34     }
     35 
     36     mutating func append(data: Data, offset: UInt, size: UInt) {
     37         self.append(Data.clampedData(data, offset: offset, size: size))
     38     }
     39 
     40     init(fromData data: Data, offset: UInt, size: UInt) {
     41         self.init(Data.clampedData(data, offset: offset, size: size))
     42     }
     43 }