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