快速将字符串转换为二进制?

Posted

技术标签:

【中文标题】快速将字符串转换为二进制?【英文标题】:Convert a String to binary in swift? 【发布时间】:2017-03-02 11:30:45 【问题描述】:

有没有办法在 Swift 中将字符串转换为二进制?

在 SO 上找到 this link,但它只处理转换小数。我也在尝试转换特殊字符和字母。

尝试构建一个已知 ASCII 字符数组并比较它们(适用于字母),但在比较特殊字符时遇到问题。

感谢您的回复。

【问题讨论】:

无论字符串包含什么,我都想将字符串分解为 1 和 0。然后从那里我将进入第二阶段...... 【参考方案1】:

使用func data(using encoding: String.Encoding, allowLossyConversion: Bool = default) -> Data?

例子:

斯威夫特 5

let string = "The string"
let binaryData = Data(string.utf8)

斯威夫特 3

let string = "The string"
let binaryData: Data? = string.data(using: .utf8, allowLossyConversion: false)

编辑:或者等等,你需要二进制表示你的数据还是 0/1 的字符串?

编辑: 对于 0/1 的字符串,使用类似:

let stringOf01 = binaryData?.reduce("")  (acc, byte) -> String in
    acc + String(byte, radix: 2)

编辑:Swift 2

let binaryData = str.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)

【讨论】:

是的,它试图让 0101010 有点风格 这对 swift3 非常有用,谢谢 :) 出于公共利益,您是否知道在 swift2 中也可以做到这一点? @AMAN77、Data -> NSData.data(using:… -> .dataUsing(…,只是回滚名称。 在您的答案中添加了一些 swift 2 代码,但一直在努力完成 0/1 字符串部分。 请注意,至少 swift 3 版本不显示前导零。【参考方案2】:

斯威夫特 5:

这将添加一个字符串扩展

extension String 
    func stringToBinary() -> String 
        let st = self
        var result = ""
        for char in st.utf8 
            var tranformed = String(char, radix: 2)
            while tranformed.count < 8 
                tranformed = "0" + tranformed
            
            let binary = "\(tranformed) "
            result.append(binary)
        
        return result
    

这将返回一个由空格分隔的 0 和 1 的字符串。如果需要,您可以修改它以返回一个数组。

实施:

let string = "Hello World"
let newString = string.stringToBinary()

【讨论】:

【参考方案3】:

对于 Swift 5,您可以像这样添加字符串扩展:

extension String 
    var hexaToBinary: String 
        return hexaToBytes.map 
            let binary = String($0, radix: 2)
            return repeatElement("0", count: 8-binary.count) + binary
        .joined()
    

    private var hexaToBytes: [UInt8] 
        var start = startIndex
        return stride(from: 0, to: count, by: 2).compactMap  _ in
            let end = index(after: start)
            defer  start = index(after: end) 
            return UInt8(self[start...end], radix: 16)
        
    

【讨论】:

以上是关于快速将字符串转换为二进制?的主要内容,如果未能解决你的问题,请参考以下文章

将十进制字符串转换为十六进制字符串而不将字符串转换为整数

将任何文件转换为二进制字符串并从二进制转换为文件[关闭]

java中如何将字符串转换为二进制数

将十六进制字符串转换为二进制

将二进制字符串转换为字节数组

将二进制文件转换为Base64字符串