【问题标题】:How to convert array of bytes [UInt8] into hexa string in Swift如何在 Swift 中将字节数组 [UInt8] 转换为十六进制字符串
【发布时间】:2015-11-05 14:21:39
【问题描述】:

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

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]

【问题讨论】:

  • 您的字节数组和result 不匹配。 0如何转换为十六进制的F
  • @Zoff Dino,是的,你是对的。我给出了一些示例代码。 '字符串转换十六进制字符串'方法工作正常

标签: swift


【解决方案1】:

Xcode 11 • Swift 5.1 或更高版本

extension StringProtocol {
    var hexa: [UInt8] {
        var startIndex = self.startIndex
        return (0..<count/2).compactMap { _ in
            let endIndex = index(after: startIndex)
            defer { startIndex = index(after: endIndex) }
            return UInt8(self[startIndex...endIndex], radix: 16)
        }
    }
}

extension DataProtocol {
    var data: Data { .init(self) }
    var hexa: String { map { .init(format: "%02x", $0) }.joined() }
}

"0f00ff".hexa                 // [15, 0, 255]
"0f00ff".hexa.data            // 3 bytes
"0f00ff".hexa.data.hexa       // "0f00ff"
"0f00ff".hexa.data as NSData  // <0f00ff>

注意:Swift 4 或 5 语法点击here

【讨论】:

  • 感谢回答,但我需要将字节数组转换为字符串或将十六进制字符串转换为字符串。请给我同样的例子
  • 非常优雅。唯一更好的办法是也添加相反的内容。
  • 很好,但十六进制字符串的可读性会更好,每 8 个字符有一个空格:6162636465666768696a6b6c6d6e6f7061626364 65666768 696a6b6c 6d6e6f70。但我猜 Swift 讨厌十六进制显示。
  • 我知道并使用它。我发现有趣的是,Apple 在使用 Swift 显示数据时已从十六进制转换为十进制,并且在许多情况下效果不佳。
【解决方案2】:

感谢布赖恩的例行公事。它可以方便地添加为 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

【讨论】:

  • map{ String(format:"%02X", $0 }.joined(separator: spacing) 一个班轮。顺便说一句,您可以简单地扩展DataProtocol。欢迎使用 Swift!
【解决方案3】:

XCode 12-beta 6.

我知道它很晚,但我使用这个简单的例程,它给出了一个任意间距。我在 Android 上从 Java 转换它。我也有 C 和其他语言版本 - 当您不记得所有特定语言的库时,很容易从一种语言转换到另一种语言。

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 人可以“迅速化”它。

【讨论】:

  • Swiftified bytes.map{String(format:"%02X", $0)}.joined(separator: spacing)
猜你喜欢
  • 2017-09-07
  • 1970-01-01
  • 1970-01-01
  • 2013-01-14
  • 2017-08-23
  • 2015-09-21
  • 1970-01-01
相关资源
最近更新 更多