当前位置: 首页 > 面试题库 >

如何快速将数据转换为十六进制字符串

夏侯博
2023-03-14
问题内容

我想要Swift中Data值的十六进制表示。

最终,我想像这样使用它:

let data = Data(base64Encoded: "aGVsbG8gd29ybGQ=")!
print(data.hexString)

问题答案:

一种替代实现(取自“ 如何使用
Swift 将字符串加密到sha1 ?,并带有大写
输出的附加选项)”

extension Data {
    struct HexEncodingOptions: OptionSet {
        let rawValue: Int
        static let upperCase = HexEncodingOptions(rawValue: 1 << 0)
    }

    func hexEncodedString(options: HexEncodingOptions = []) -> String {
        let format = options.contains(.upperCase) ? "%02hhX" : "%02hhx"
        return map { String(format: format, $0) }.joined()
    }
}

hexEncodedString(options:)按照现有
方法的样式选择了一种方法base64EncodedString(options:)

Data符合Collection协议,因此可以使用map()
每个字节映射到相应的十六进制字符串。该%02x格式
以16为基数打印自变量,如有必要,最多填充两位数,并以前导零表示。
的hh改性剂引起的参数(其为上的整数传递
堆栈)被当作一个字节的数量。此处可以省略修饰符,
因为它$0是一个无符号的数字(UInt8),并且不会出现符号扩展名
,但是将其保留在其中也无害。

然后将结果连接到单个字符串。

例:

let data = Data(bytes: [0, 1, 127, 128, 255])
print(data.hexEncodedString()) // 00017f80ff
print(data.hexEncodedString(options: .upperCase)) // 00017F80FF

以下实现速度提高了约120倍(使用1000个
随机字节进行了测试)。它类似于RenniePet的
解决方案和Nick Moore的
解决方案,但是基于UTF-16
代码单元,Swift字符串(当前)用作内部存储。

extension Data {
    struct HexEncodingOptions: OptionSet {
        let rawValue: Int
        static let upperCase = HexEncodingOptions(rawValue: 1 << 0)
    }

    func hexEncodedString(options: HexEncodingOptions = []) -> String {
        let hexDigits = Array((options.contains(.upperCase) ? "0123456789ABCDEF" : "0123456789abcdef").utf16)
        var chars: [unichar] = []
        chars.reserveCapacity(2 * count)
        for byte in self {
            chars.append(hexDigits[Int(byte / 16)])
            chars.append(hexDigits[Int(byte % 16)])
        }
        return String(utf16CodeUnits: chars, count: chars.count)
    }
}


 类似资料:
  • 问题内容: 我在ex中有整数。16,我正在尝试将此数字转换为十六进制数字。我试图通过使用十六进制函数来实现此目的,但是每当您向十六进制函数提供整数时,它都会返回十六进制数字的字符串表示形式, 有人可以告诉我如何将字符串格式的十六进制数字转换为简单的十六进制数字。 谢谢!! 问题答案:

  • 问题内容: 我编写了一个简单的程序,用于在Java中向串行端口发送和接收数据。我通过回送测试(Rx到Tx)连接串行端口设备。它工作正常。但我无法发送和接收十六进制数据到串行端口和接收串行端口。在我的设备中使用了FT232BL芯片,因此是否需要任何dll或其他库来将十六进制数据发送和接收到串行端口设备。我的代码如下。 问题答案: 十六进制: 十六进制为:

  • 问题内容: 我写了一些代码将十六进制显示字符串转换为十进制整数。但是,当输入类似100a或625b(带有字母的东西)时,我得到了这样的错误: java.lang.NumberFormatException:对于输入字符串:java.lang.Integer.parseInt(未知源)处的java.lang.NumberFormatException.forInputString(未知源)处为“ 1

  • 我正在写一个Rust程序,读取I2C总线并保存数据。当我读取I2C总线时,我会得到十六进制值,比如,,等等。 现在,我只能将其作为字符串处理并按原样保存。有没有办法把它解析成一个整数?它有内置的功能吗?

  • 问题内容: 要将String转换为十六进制,我正在使用: 在此处投票最高的答案中对此进行了概述:在Java中将 字符串转换为十六进制 我该如何反向执行,即将十六进制转换为字符串? 问题答案: 您可以从转换后的字符串中进行重构,这是一种实现方法: 另一种方法是使用,从包: 单元测试以验证: 注:领先剥离的仅仅是必要的,因为的你的填充方法。如果您不介意将其替换为简单的,则可以将此行放在:

  • 问题内容: 我想将一个整数(将为<= 255)用于十六进制字符串表示形式 例如:我想通过并离开,或获得。 我曾尝试使用65来执行此操作,但由于它想采用单个字符串,因此上述内容均会阻塞。 问题答案: 您正在寻找功能。 您似乎在混合使用整数的十进制表示形式和整数的十六进制表示形式,因此尚不清楚您需要什么。根据您的描述,我认为这些片段之一显示了您想要的内容。 请注意,这与 包含整数(十六进制)的字符串