我发现了一些有关此主题的过时信息,但没有一个解决方案与当前的Swift版本相匹配。所以我决定再问这个问题!
我有一个这样的字符串:
var string="abc"
...并且使用以下代码我将把字符串翻译成二进制代码:
let binaryString = (string.data(using: .utf8, allowLossyConversion: false)?.reduce("") { (a, b) -> String in a + String(b, radix: 2) })!
但是如何将特定的二进制字符串解码回人类可读的字符串?
从
"110000111000101100011"
获取-----> " ABC"
答案 0 :(得分:-1)
在目前的形式中,转换非常困难。但是,通过对如何获取二进制字符串进行一些调整,它应该是可能的。
创建二进制字符串时,应始终填充String(b, radix: 2)
返回的字符串,使其始终为8个字符。
现在,你可以
UInt8
UInt8
添加到数组Data
编辑:将字符串填充为8个字符的扩展名:
extension String {
func padTo8() -> String {
if self.count < 8 {
return String(Array(repeating: "0", count: 8-self.count)) + self
} else {
return self
}
}
}
以下是完整代码:
extension Array {
public func split(intoChunksOf chunkSize: Int) -> [[Element]] {
return stride(from: 0, to: self.count, by: chunkSize).map {
let endIndex = ($0.advanced(by: chunkSize) > self.count) ? self.count - $0 : chunkSize
return Array(self[$0..<$0.advanced(by: endIndex)])
}
}
}
extension String {
func padTo8() -> String {
if self.count < 8 {
return String(Array(repeating: "0", count: 8-self.count)) + self
} else {
return self
}
}
// split(intoChunksOf:) implementation from SwiftyUtils
// https://github.com/tbaranes/SwiftyUtils
public func split(intoChunksOf chunkSize: Int) -> [String] {
var output = [String]()
let splittedString = self
.map { $0 }
.split(intoChunksOf: chunkSize)
splittedString.forEach {
output.append($0.map { String($0) }.joined(separator: ""))
}
return output
}
}
let binaryString = ("abc".data(using: .utf8, allowLossyConversion: false)?.reduce("") { (a, b) -> String in a + String(b, radix: 2).padTo8() })!
let byteArray = binaryString.split(intoChunksOf: 8).map { UInt8(strtoul($0, nil, 2)) }
let string = String(bytes: byteArray, encoding: .utf8)