Refactor Base32 encoder
This commit is contained in:
parent
7664bd83d9
commit
f79781d04d
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue