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