Swift将三位数Base64数字转换为整数

Swift将三位数Base64数字转换为整数,swift,Swift,我在base64中写入了最多3个字符的值 我想转换成整数 所以“A”=0,“A”=26和“/”=63 我想用像这样的东西 Int("Cat", radix: 64) 但允许的最大值是基数:36 是否有其他内置的东西,或者我需要编写自己的转换例程 例如,我希望值“Cat”=45*64^0+26*64^1+2*64^2=9901我认为最好使用标准的base 64填充,但如果不能这样做,您仍然可以依赖很多: 注意:这应该让您知道该怎么做,但它不支持小于24位的整数类型。您可以对此进行改进,或者至少将

我在base64中写入了最多3个字符的值

我想转换成整数

所以“A”=0,“A”=26和“/”=63

我想用像这样的东西

Int("Cat", radix: 64)
但允许的最大值是基数:36

是否有其他内置的东西,或者我需要编写自己的转换例程


例如,我希望值“Cat”=45*64^0+26*64^1+2*64^2=9901

我认为最好使用标准的base 64填充,但如果不能这样做,您仍然可以依赖很多:

注意:这应该让您知道该怎么做,但它不支持小于24位的整数类型。您可以对此进行改进,或者至少将其从
FixedWidthInteger
更改,否则该值太宽

扩展名FixedWidthInteger{
初始化?(未添加DBASE64编码字符串:字符串){
警卫
案例让ZeroPaddingToEach3ByTemple=
字符串(重复“A”,计数:4-String.count%4),
let data=data(base64编码:ZeroPaddingToEach3ByTeMultiple+字符串)
else{return nil}
让zeroPaddingToFillMemory=数组(
重复:0作为UInt8,
计数:Self.bitWidth/UInt8.bitWidth-data.count
)
自我=
(数据(zeroPaddingToFillMemory)+数据)
.withUnsafeBytes{$0.load(as:Self.Self).bigEndian}
}
}
Int(unpaddedBase64Encoded:“Cat”)//9901
UInt32(未添加数据库64编码:“A”)//0
如果你需要相反的方式:

扩展字符串{
init?(未添加DBASE64编码整数:整数){
如果整数==0{
self=“A”
返回
}
设fourCharactersBitCount=4*6
设maxFourCharactersCount=Integer.bitWidth/fourCharactersBitCount

guard integer<1正如Sulthan所指出的,这不是大多数人所说的“Base64”这是一种压缩为8位字节的6位编码。这是一种未打包的版本,我从未在实践中使用过。但你可以用与计算任何基数相同的方法来计算它,方法是在符号映射中找到每个符号,移动当前值,然后添加新的位置值。虽然可能不需要,但我扩展了它此方法适用于任意基数和任意符号集

extension FixedWidthInteger {
    init?(unpackedBase64 string: String) {
        let symbols = Array("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/")

        var result = Self.zero
        for char in string {
            result *= Self(symbols.count)
            guard let placeValue = symbols.firstIndex(of: char) else { return nil }
            result += Self(placeValue)
        }
        self = result
    }
}

Int(unpackedBase64: "Cat") // 9901

也许你应该删除维基百科中关于Base64编码的文章,而不是你想使用的Base64整数。库中没有你可以使用的东西,因为通常我们写数字时不区分大小写(这就是为什么基数=36是最大值)。你是说
“a”=26
这里?我喜欢这个答案,但选择了Rob's,因为它更复杂(聪明),也不适用于更大的值。
extension FixedWidthInteger {
    init?(unpackedBase64 string: String) {
        let symbols = Array("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/")

        var result = Self.zero
        for char in string {
            result *= Self(symbols.count)
            guard let placeValue = symbols.firstIndex(of: char) else { return nil }
            result += Self(placeValue)
        }
        self = result
    }
}

Int(unpackedBase64: "Cat") // 9901