二进制字符串到人类可读的字符串

时间:2018-01-07 17:16:11

标签: ios swift binary

我发现了一些有关此主题的过时信息,但没有一个解决方案与当前的Swift版本相匹配。所以我决定再问这个问题!

我有一个这样的字符串:

var string="abc"

...并且使用以下代码我将把字符串翻译成二进制代码:

let binaryString = (string.data(using: .utf8, allowLossyConversion: false)?.reduce("") { (a, b) -> String in a + String(b, radix: 2) })!

但是如何将特定的二进制字符串解码回人类可读的字符串?

  

"110000111000101100011"获取-----> " ABC"

1 个答案:

答案 0 :(得分:-1)

在目前的形式中,转换非常困难。但是,通过对如何获取二进制字符串进行一些调整,它应该是可能的。

创建二进制字符串时,应始终填充String(b, radix: 2)返回的字符串,使其始终为8个字符。

现在,你可以

  1. 将二进制字符串拆分为8个字符的组。
  2. 将每个组转换为UInt8
  3. 将这些UInt8添加到数组
  4. 使用数组
  5. 创建Data
  6. 从数据
  7. 创建字符串

    编辑:将字符串填充为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)