String+BASE64.swift 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. //
  2. // String+BASE64.swift
  3. // Swifter
  4. //
  5. // Copyright © 2016 Damian Kołakowski. All rights reserved.
  6. //
  7. import Foundation
  8. extension String {
  9. private static let CODES = [UInt8]("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".utf8)
  10. public static func toBase64(_ data: [UInt8]) -> String? {
  11. // Based on: https://en.wikipedia.org/wiki/Base64#Sample_Implementation_in_Java
  12. var result = [UInt8]()
  13. var tmp: UInt8
  14. for index in stride(from: 0, to: data.count, by: 3) {
  15. let byte = data[index]
  16. tmp = (byte & 0xFC) >> 2
  17. result.append(CODES[Int(tmp)])
  18. tmp = (byte & 0x03) << 4
  19. if index + 1 < data.count {
  20. tmp |= (data[index + 1] & 0xF0) >> 4
  21. result.append(CODES[Int(tmp)])
  22. tmp = (data[index + 1] & 0x0F) << 2
  23. if index + 2 < data.count {
  24. tmp |= (data[index + 2] & 0xC0) >> 6
  25. result.append(CODES[Int(tmp)])
  26. tmp = data[index + 2] & 0x3F
  27. result.append(CODES[Int(tmp)])
  28. } else {
  29. result.append(CODES[Int(tmp)])
  30. result.append(contentsOf: [UInt8]("=".utf8))
  31. }
  32. } else {
  33. result.append(CODES[Int(tmp)])
  34. result.append(contentsOf: [UInt8]("==".utf8))
  35. }
  36. }
  37. return String(bytes: result, encoding: .utf8)
  38. }
  39. }