如何将 swift 字符串编码为整数

问题描述 投票:0回答:1

假设我有一个字符串 n(在 swift 编程语言中),它由各种字符组成,例如“uFxXobTXkaaU57yrm3hF”。我想将其编码为一个整数,我可以轻松解码该整数以返回原始字符串。我不知道如何做到这一点 - 我相信可能有一些功能,但我不知道它是什么。有谁知道可以做到这一点的功能吗? (编码和解码)。

arrays swift encoding
1个回答
0
投票

无法将任意长度、任意字符的字符串转换为 Int,因为 Int 只有 64 位。

但是,如果您限制问题,那么您可以将仅包含某些字符的特定长度的字符串转换为 Int。或者更好的是,转换为无符号 64 位 Int。

例如,您可以将支持的字符限制为以下内容:

0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ

该集合中有 62 个字符,因此每个字符至少需要 6 位才能表示为整数。因此,可以将最多包含 10 个这些字符的字符串表示为无符号 64 位整数。

这是一个 Playground 示例,其中包含几个执行转换的函数。此代码缺少对字符串的长度检查,但您可以添加它。

let bitsPerChar = 6
let charMask = UInt64(63)
let alphabet = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
let alphabetArray = Array(alphabet)

func string2number(_ s: String) -> UInt64 {
    var result = UInt64.zero
    for char in s {
        result <<= bitsPerChar
        let pos: Int
        if let index = alphabet.firstIndex(of: char) {
            pos = alphabet.distance(from: alphabet.startIndex, to: index) + 1
        } else {
            pos = 63
        }
        result += UInt64(pos)
    }
    return result
}

func number2String(_ value: UInt64) -> String {
    var result = ""
    var val = value
    while val > 0 {
        let index = val & charMask
        if index == 0 || index >= 63 {
            result = "?" + result
        } else {
            let charIndex = Int(index) - 1
            result = String(alphabetArray[charIndex]) + result
        }
        val >>= bitsPerChar
    }
    return result
}

for s in [
    "0123456789",
    "abcdefghij",
    "klmnopqrst",
    "uvwxyz",
    "ABCDEFGHIJ",
    "KLMNOPQRST",
    "UVWXYZ",
    "uFxXobTXka",
    "aU57yrm3hF"
] {
    let val = string2number(s)
    print("\(number2String(val)) = \(val)")
}
0123456789 = 18590822951584330
abcdefghij = 201594236381242580
klmnopqrst = 384597649810900830
uvwxyz = 33831659748
ABCDEFGHIJ = 677403111298354030
KLMNOPQRST = 860406524728012280
UVWXYZ = 62192078718
uFxXobTXka = 570421986625570123
aU57yrm3hF = 214229433368462506
© www.soinside.com 2019 - 2024. All rights reserved.