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 }