如何在Swift中将字节数组[UInt8]转换为hexa字符串

时间:2015-11-05 14:21:39

标签: swift

我发现如何将六进制字符串转换为字节[UInt8],但我还没有找到如何将字节[UInt8]转换为Swift中的六进制字符串

hexstring转换为string代码:

static func bytesConvertToHexstring(byte : [UInt8]) -> String {
    var string = ""

    for val in byte {
        //getBytes(&byte, range: NSMakeRange(i, 1))
        string = string + String(format: "%02X", val)
    }

    return string
}

同样的结果:

"F063C52A6FF7C8904D3F6E379EB85714ECA9C1CB1E8DFD6CA5D3B4A991269D60F607C565C327BD0ECC0985F74E5007E0D276499E1ADB4E0C92D8BDBB46E57705B2D5390FF5CBD4ED1B850C537301CA7E"

UInt8数组:[0, 11, 8, 15, 6, 6, 5, 8, 8, 4, 14, 14, 0, 0, 9, 12, 6, 4, 10, 6, 4, 8, 6, 2, 14, 2, 6, 13, 3, 3, 12, 4, 3, 12, 8, 13, 14, 4, 10, 1, 12, 15, 4, 0, 14, 14, 0, 8, 8, 14, 6, 15, 2, 2, 9, 15, 13, 6, 2, 6, 8, 15, 4, 2, 12, 1, 0, 13, 13, 4, 6, 0, 9, 6, 8, 2, 7, 0, 6, 1, 3, 3, 9, 15, 5, 7, 12, 8, 7, 5, 13, 14, 15, 6, 7, 6, 12, 6, 7, 7, 11, 9, 6, 0, 14, 5, 6, 14, 1, 5, 13, 10, 12, 13, 14, 2, 13, 14, 4, 7, 13, 0, 3, 10, 6, 11, 9, 12, 7, 11, 5, 3, 5, 11, 4, 9, 6, 10, 14, 0, 11, 7, 15, 9, 3, 14, 5, 1, 10, 14, 5, 6, 12, 4, 12, 14, 4, 3, 9, 8, 0]

3 个答案:

答案 0 :(得分:15)

Xcode 9或更高版本•Swift 4或更高版本

extension String {
    var hexaBytes: [UInt8] {
        var position = startIndex
        return (0..<count/2).flatMap { _ in    // for Swift 4.1 or later use compactMap instead of flatMap
            defer { position = index(position, offsetBy: 2) }
            return UInt8(self[position...index(after: position)], radix: 16)
        }
    }
    var hexaData: Data { return hexaBytes.data }
}

extension Collection where Element == UInt8 {
    var data: Data {
        return Data(self)
    }
    var hexa: String {
        return map{ String(format: "%02X", $0) }.joined()
    }
}
"0f00ff".hexaBytes           // [15, 0, 255]
"0f00ff".hexaData            // 3 bytes
"0f00ff".hexaData.hexa       // "0F00FF"
"0f00ff".hexaData as NSData  // <0f00ff>

答案 1 :(得分:0)

XCode 12-beta 6。

我知道晚了,但是我使用了一个简单的例程,它给出了一个任意的间隔。我是从Android上的Java转换过来的

public static func bytesToHex(bytes: [UInt8], spacing: String) -> String
{
    var hexString: String = ""
    var count = bytes.count
    for byte in bytes
    {
        hexString.append(String(format:"%02X", byte))
        count = count - 1
        if count > 0
        {
            hexString.append(spacing)
        }
    }
    return hexString
}

它将创建一个两位数的十六进制字符串,其中元素之间具有任意间隔字符串。例如,我使用它来显示特征读取的结果

let charValue = [UInt8](characteristic.value ?? Data())
    print("Characteristic \(characteristic.uuid) read with value: \(Btle.bytesToHex(bytes: charValue, spacing: " "))")

具有如下所示的输出:

Characteristic System ID read with value: 00 1C 05 FF FE FF E8 74

我在Swift和iOS方面的经验非常有限;也许经验丰富的Swift人可以“迅速化”它。

答案 2 :(得分:0)

感谢Brian的例行工作。可以方便地将其添加为Swift扩展,如下所示。

 extension Array where Element == UInt8 {
  func bytesToHex(spacing: String) -> String {
    var hexString: String = ""
    var count = self.count
    for byte in self
    {
        hexString.append(String(format:"%02X", byte))
        count = count - 1
        if count > 0
        {
            hexString.append(spacing)
        }
    }
    return hexString
}

}

通话示例:

let testData: [UInt8] = [15, 0, 255]
print(testData.bytesToHex(spacing: " "))          // 0F 00 FF