Swiftを独学でアプリにBase32デコードを実装しようとしていますが、この言語でバイトレベルを下回る方法を理解できないようです。UInt8 を 5 ビットに切り詰めて、それを Data オブジェクトに追加してから操作できると便利です。
私はPythonで書かれたこの関数を持っています:
def base32_decode(secret):
b32alphabet = list("ABCDEFGHIJKLMNOPQRSTUVWXYZ234567")
b32v = [b32alphabet.index(x) for x in secret if x != '=']
t1 = ["{0:0>5}".format(bin(v)[2:]) for v in b32v]
t2 = ''.join(t1)
t3 = textwrap.wrap(t2,8)
t4 = [int(v, 2) for v in t3 if len(v) == 8]
t5 = ''.join(["{0:0>2}".format(hex(v)[2:]) for v in t4])
これは、base32 でデータの 16 進表現を出力するように機能します。これをSwiftで複製したかったのですが(16進部分への変換ではありません)。しかし、私はこれまでに得ました:
func base32decode(string: String) -> Data
{
let b32a: Array = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "2", "3", "4", "5", "6", "7"]
let complete: NSMutableData = NSMutableData()
var b32v: Array<UInt8> = []
for c in string.characters
{
let index = b32a.index(of: String(c))!
b32v.append(UInt8(index)) // Need to append only the 5 LSB
}
// Return b32v as base 32 decoded data
...
これを行う簡単な方法はありますか?Google で何も見つかりません。