Refactor Base32 encoder

This commit is contained in:
Yasuhiro Hatta 2019-01-13 12:32:35 +09:00
parent 7664bd83d9
commit f79781d04d
1 changed files with 29 additions and 29 deletions

View File

@ -33,32 +33,16 @@ enum Base32 {
} }
enum Base32Error: Error {
case invalidCharacter
}
extension Data { extension Data {
/// Decode Crockford's Base32 /// Decode Crockford's Base32
init?(base32Encoded base32String: String, using table: [UInt8] = Base32.crockfordsDecodingTable) { init?(base32Encoded base32String: String, using table: [UInt8] = Base32.crockfordsDecodingTable) {
guard base32String.unicodeScalars.allSatisfy({ $0.isASCII }) else {
return nil
}
var base32String = base32String var base32String = base32String
while let last = base32String.last, last == "=" { while let last = base32String.last, last == "=" {
base32String.removeLast() base32String.removeLast()
} }
guard [0, 2, 4, 5, 7].contains(base32String.count % 8) else {
return nil
}
let dstlen = base32String.count * 5 / 8 let result: Data? = base32String.withCString(encodedAs: Unicode.ASCII.self) { (src) in
var buffer = Data(count: dstlen)
let success: Bool = buffer.withUnsafeMutableBytes { (dst: UnsafeMutablePointer<UInt8>) in
base32String.withCString(encodedAs: Unicode.ASCII.self) { (src) in
func _strlen(_ str: UnsafePointer<UInt8>) -> Int { func _strlen(_ str: UnsafePointer<UInt8>) -> Int {
var str = str var str = str
var i = 0 var i = 0
@ -69,7 +53,16 @@ extension Data {
return i return i
} }
var srcleft = _strlen(src) let srclen = _strlen(src)
guard [0, 2, 4, 5, 7].contains(srclen % 8) else {
return nil
}
let dstlen = srclen * 5 / 8
var buffer = Data(count: dstlen)
let success: Bool = buffer.withUnsafeMutableBytes { (dst: UnsafeMutablePointer<UInt8>) in
var srcleft = srclen
var srcp = src var srcp = src
var dstp = dst var dstp = dst
@ -112,12 +105,19 @@ extension Data {
return true return true
} }
}
guard success else { guard success else {
return nil return nil
} }
self = buffer return buffer
}
guard let data = result else {
return nil
}
self = data
} }
/// Encode Crockford's Base32 /// Encode Crockford's Base32