NSData.swift 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. //
  2. // NSData.swift
  3. // LoopKit
  4. //
  5. // Created by Nate Racklyeft on 8/26/16.
  6. // Copyright © 2016 Nathan Racklyeft. All rights reserved.
  7. //
  8. import Foundation
  9. // String conversion methods, adapted from https://stackoverflow.com/questions/40276322/hex-binary-string-conversion-in-swift/40278391#40278391
  10. extension Data {
  11. init?(hexadecimalString: String) {
  12. self.init(capacity: hexadecimalString.utf16.count / 2)
  13. // Convert 0 ... 9, a ... f, A ...F to their decimal value,
  14. // return nil for all other input characters
  15. func decodeNibble(u: UInt16) -> UInt8? {
  16. switch u {
  17. case 0x30 ... 0x39: // '0'-'9'
  18. return UInt8(u - 0x30)
  19. case 0x41 ... 0x46: // 'A'-'F'
  20. return UInt8(u - 0x41 + 10) // 10 since 'A' is 10, not 0
  21. case 0x61 ... 0x66: // 'a'-'f'
  22. return UInt8(u - 0x61 + 10) // 10 since 'a' is 10, not 0
  23. default:
  24. return nil
  25. }
  26. }
  27. var even = true
  28. var byte: UInt8 = 0
  29. for c in hexadecimalString.utf16 {
  30. guard let val = decodeNibble(u: c) else { return nil }
  31. if even {
  32. byte = val << 4
  33. } else {
  34. byte += val
  35. self.append(byte)
  36. }
  37. even = !even
  38. }
  39. guard even else { return nil }
  40. }
  41. var hexadecimalString: String {
  42. return map { String(format: "%02hhx", $0) }.joined()
  43. }
  44. }
  45. extension Data {
  46. static func newPumpEventIdentifier() -> Data {
  47. return Data(UUID().uuidString.utf8)
  48. }
  49. }