Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 4十六进制字符串到二进制字符串_Swift_Binary_Hex - Fatal编程技术网

Swift 4十六进制字符串到二进制字符串

Swift 4十六进制字符串到二进制字符串,swift,binary,hex,Swift,Binary,Hex,注意,将十六进制字符串转换为二进制字符串的旧方法已从swift中删除,即:string(十六进制,基数:2)->binary string swift 4中的替代方案是什么?您首先需要将您的十六进制字符串转换为字节数组[UInt8]。然后,您可以使用字符串(u,基数:)将字节转换为二进制。请注意,如果要返回一个字符串而不是字符串数组[String],则需要添加前导零以使二进制字符串长度一致(8个字符): 我不记得任何函数会将十六进制字符串转换为另一个任意基数的字符串。也许您正在考虑使用任意基数

注意,将十六进制字符串转换为二进制字符串的旧方法已从swift中删除,即:string(十六进制,基数:2)->binary string


swift 4中的替代方案是什么?

您首先需要将您的十六进制字符串转换为字节数组
[UInt8]
。然后,您可以使用
字符串(u,基数:)
将字节转换为二进制。请注意,如果要返回一个
字符串
而不是字符串数组
[String]
,则需要添加前导零以使二进制字符串长度一致(8个字符):



我不记得任何函数会将十六进制字符串转换为另一个任意基数的字符串。也许您正在考虑使用任意基数在字符串和整数值(反之亦然)之间转换的初始值设定项函数:

let hex = "00ff01fe"
let value = UInt64(hex, radix: 16)!
let binary = String(value, radix: 2)
let paddedBinary = repeatElement("0", count: 64 - binary.count) + binary
但这仅适用于十六进制字符串表示64位值的情况,但它说明了基本思想。转换为某个整数类型,然后转换回二进制,用零填充

如果您的十六进制字符串长度超过该值,则不能使用上述值。但是,您可以将十六进制字符串的各个字符映射为数值,构建每个字符的二进制表示形式,将它们置零,并使用
连接的
将它们连接在一起:

let hex = "ffeeddccbbaa99887766554433221100"

let result = hex.compactMap { c -> String? in
    guard let value = Int(String(c), radix: 16) else { return nil }
    let string = String(value, radix: 2)
    return repeatElement("0", count: 4 - string.count) + string
}.joined()

用您如何使用删除函数的示例更新您的问题。当我使用此函数时,我遇到以下错误:-致命错误:无法前进到endIndex之前。。。请帮我解决这个问题。这可能意味着你得到了一个额外的字节。您应该会收到偶数个字节。您可以检查字节数。你能用失败的数据发布一个指向该文件的链接吗?你需要删除0x前缀。请注意,对于这个答案,“hex”最大长度是16个字符(否则“value”将为零),如果是更宽的十六进制字符串,请使用Leo Dabus answer。@pw2-不正确。当然,第一个代码段只适用于64位值,但其要点只是让读者了解如何将十六进制字符串转换为整数,然后将该整数转换为二进制字符串。但是第二个代码段处理任意长度的十六进制字符串(并且优雅地处理十六进制字符串中的空白或类似内容,而Leo的答案没有)。
let hex = "00ff01fe"
let value = UInt64(hex, radix: 16)!
let binary = String(value, radix: 2)
let paddedBinary = repeatElement("0", count: 64 - binary.count) + binary
let hex = "ffeeddccbbaa99887766554433221100"

let result = hex.compactMap { c -> String? in
    guard let value = Int(String(c), radix: 16) else { return nil }
    let string = String(value, radix: 2)
    return repeatElement("0", count: 4 - string.count) + string
}.joined()