我试图实现接受String的函数并返回由位组成的字符串。我正在遍历String的utf8表示并使用reduce
附加下一个字母。
问题是Swift没有添加前导位,所以我不得不手动添加它们。当转换字符串如“abcd”,“fgh”等时,它工作正常,但例如“abc d”产生缺少一位的字符串。
我的实施:
extension String {
func toBinary() -> String {
return self.utf8.reduce("", { (result, ui) -> String in
result + "0" + String(utf, radix: 2)
})
}
}
和“abc d”.toBinary()返回:
当正确的陈述是:时, 011000010110001001100011010000001100100
0110000101100010011000110010000001100100
当我将二进制文件转换回String时,它对没有空格的字符串工作正常,但在这种情况下它会返回不同的字符串,例如:“abc @”
有什么方法可以解决这个问题吗?
答案 0 :(得分:4)
正如@rmaddy在评论中指出的那样,您的代码假设String(utf, radix: 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))!)
})
}
}
测试:
print(" ".toBinary())
00100000
将UInt8
转换为8个字符的二进制String
的其他转换:
String(("0000000" + String(utf, radix: 2)).suffix(8))
String(String(256 + Int(utf), radix: 2).dropFirst())