Ios 将字符串转换为二进制时缺少一位

Ios 将字符串转换为二进制时缺少一位,ios,swift,string,binary,Ios,Swift,String,Binary,我试图实现一个函数,它接受字符串并返回由位组成的字符串。我正在遍历字符串的utf8表示,并使用reduce来追加下一个字母。 问题是Swift没有添加前导位,所以我不得不手动添加它们。当转换诸如“abcd”、“fgh”等字符串时,它可以正常工作,但例如“abcd”会生成缺少一位的字符串 我的实施: extension String { func toBinary() -> String { return self.utf8.reduce("", { (result

我试图实现一个函数,它接受字符串并返回由位组成的字符串。我正在遍历字符串的utf8表示,并使用
reduce
来追加下一个字母。 问题是Swift没有添加前导位,所以我不得不手动添加它们。当转换诸如“abcd”、“fgh”等字符串时,它可以正常工作,但例如“abcd”会生成缺少一位的字符串

我的实施:

extension String {
    func toBinary() -> String {

        return self.utf8.reduce("", { (result, ui) -> String in
            result + "0" + String(utf, radix: 2)
        })
    }
}
和“abc d”。toBinary()返回:

011000010110001001100011010000001110000

0110000101100010011000110011001100100

当我将二进制文件转换回字符串时,它对没有空格的字符串很有效,但在本例中,它返回不同的字符串,例如:“abc@”


有没有办法解决这个问题?

正如@rmaddy在评论中指出的,您的代码假设
字符串(utf,基数:2)
返回一个7个字符的结果。实际上,它可以返回1到8个字符的字符串

一种解决方法是将该字符串转换为
Int
,然后用前导零格式化
Int

extension String {
    func toBinary() -> String {

        return self.utf8.reduce("", { (result, utf) -> String in
            result + String(format: "%08d", Int(String(utf, radix: 2))!)
        })
    }
}
测试:


UInt8
到8字符二进制
字符串的其他转换:

  • String(((“0000000”+字符串(utf,基数:2))。后缀(8))
  • String(String(256+Int(utf),基数:2).dropFirst())

  • 正如@rmaddy在注释中指出的,您的代码假设
    字符串(utf,基数:2)
    返回一个7个字符的结果。实际上,它可以返回1到8个字符的字符串

    一种解决方法是将该字符串转换为
    Int
    ,然后用前导零格式化
    Int

    extension String {
        func toBinary() -> String {
    
            return self.utf8.reduce("", { (result, utf) -> String in
                result + String(format: "%08d", Int(String(utf, radix: 2))!)
            })
        }
    }
    
    测试:


    UInt8
    到8字符二进制
    字符串的其他转换:

  • String(((“0000000”+字符串(utf,基数:2))。后缀(8))
  • String(String(256+Int(utf),基数:2).dropFirst())
  • String(utf,基数:2)
    返回一个没有前导零的二进制文件。您的代码假定此字符串始终为7个字符,但这是一个无效的假定。
    string(utf,基数:2)
    返回一个没有任何前导零的二进制文件。您的代码假定此字符串始终为7个字符,但这是一个无效的假定。
    00100000