import Foundation
extension Data {
// MARK: UnsafebufferPointer dangling warning
/* data.append(UnsafeBufferPointer(start: &hashValue, count: 1))
Initialization of 'UnsafeBufferPointer' results in a dangling buffer pointer
1. let data = Data(hashValue)
2. let data = Data()
data.appnd(value: value)
*/
init<T>(value: T) {
self = withUnsafePointer(to: value) { (ptr: UnsafePointer<T>) -> Data in
return Data(buffer: UnsafeBufferPointer(start: ptr, count: 1))
}
}
mutating func append<T>(value: T) {
withUnsafePointer(to: value) { (ptr: UnsafePointer<T>) in
append(UnsafeBufferPointer(start: ptr, count: 1))
}
}
// MARK: HaxEncodedString
struct HexEncodingOptions: OptionSet {
let rawValue: Int
static let upperCase = HexEncodingOptions(rawValue: 1 << 0)
}
func hexEncodedString(options: HexEncodingOptions = []) -> String {
let hexDigits = Array((options.contains(.upperCase) ? "0123456789ABCDEF" : "0123456789abcdef").utf16)
var chars: [unichar] = []
chars.reserveCapacity(2 * count)
for byte in self {
chars.append(hexDigits[Int(byte / 16)])
chars.append(hexDigits[Int(byte % 16)])
}
return String(utf16CodeUnits: chars, count: chars.count)
}
/// Hex String -> Data
public init(hex: String) {
self.init(Array<UInt8>(hex: hex))
}
/// Data -> Array<UInt8>
public var bytes: Array<UInt8> {
Array(self)
}
/// Data -> Hex String
public func toHexString() -> String {
self.bytes.toHexString()
}
}
/*
var hasher = Hasher()
hasher.combine(patternString)
var hashValue = hasher.finalize()
var data = Data()
data.append(UnsafeBufferPointer(start: &hashValue, count: 1))
log(direction: .ETC, ofType: self, datas: data.hexEncodedString())
*/