NSData+CRC.swift 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. //
  2. // NSData+CRC.swift
  3. // xDripG5
  4. //
  5. // Created by Nathan Racklyeft on 4/7/16.
  6. // Copyright © 2016 Nathan Racklyeft. All rights reserved.
  7. //
  8. import Foundation
  9. /**
  10. CRC-CCITT (XModem)
  11. [http://www.lammertbies.nl/comm/info/crc-calculation.html]()
  12. [http://web.mit.edu/6.115/www/amulet/xmodem.htm]()
  13. */
  14. extension Collection where Element == UInt8 {
  15. private var crcCCITTXModem: UInt16 {
  16. var crc: UInt16 = 0
  17. for byte in self {
  18. crc ^= UInt16(byte) << 8
  19. for _ in 0..<8 {
  20. if crc & 0x8000 != 0 {
  21. crc = crc << 1 ^ 0x1021
  22. } else {
  23. crc = crc << 1
  24. }
  25. }
  26. }
  27. return crc
  28. }
  29. var crc16: UInt16 {
  30. return crcCCITTXModem
  31. }
  32. }
  33. extension UInt8 {
  34. var crc16: UInt16 {
  35. return [self].crc16
  36. }
  37. }
  38. extension Data {
  39. var isCRCValid: Bool {
  40. return dropLast(2).crc16 == suffix(2).toInt()
  41. }
  42. func appendingCRC() -> Data {
  43. var data = self
  44. data.append(crc16)
  45. return data
  46. }
  47. }