Error[8]: Undefined offset: 10, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

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

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

extension Data {    struct HexEncodingOptions: OptionSet {        let rawValue: Int        static let upperCase = HexEncodingOptions(rawValue: 1 << 0)    }    func hexEnpredString(options: HexEncodingOptions = []) -> String {        let format = options.contains(.upperCase) ? "%02hhX" : "%02hhx"        return map { String(format: format, 
hexEnpredString(options:)
) }.joined() }}

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

Collection
符合
map()
协议,因此可以使用
UInt8

每个字节映射到相应的十六进制字符串。该%02x格式
以16为基数打印自变量,如有必要,最多填充两位数,并以前导零表示。
的hh改性剂引起的参数(其为上的整数传递
堆栈)被当作一个字节的数量。此处可以省略修饰符,
因为它$0是一个无符号的数字(
let data = Data(bytes: [0, 1, 127, 128, 255])print(data.hexEnpredString()) // 00017f80ffprint(data.hexEnpredString(options: .upperCase)) // 00017F80FF
),并且不会出现符号扩展名
,但是将其保留在其中也无害。

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

例:

extension Data {    struct HexEncodingOptions: OptionSet {        let rawValue: Int        static let upperCase = HexEncodingOptions(rawValue: 1 << 0)    }    func hexEnpredString(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)    }}

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

[+++]


)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 165, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
如何快速将数据转换为十六进制字符串_随笔_内存溢出

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

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

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

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

extension Data {    struct HexEncodingOptions: OptionSet {        let rawValue: Int        static let upperCase = HexEncodingOptions(rawValue: 1 << 0)    }    func hexEnpredString(options: HexEncodingOptions = []) -> String {        let format = options.contains(.upperCase) ? "%02hhX" : "%02hhx"        return map { String(format: format, 
hexEnpredString(options:)
) }.joined() }}

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

Collection
符合
map()
协议,因此可以使用
UInt8

每个字节映射到相应的十六进制字符串。该%02x格式
以16为基数打印自变量,如有必要,最多填充两位数,并以前导零表示。
的hh改性剂引起的参数(其为上的整数传递
堆栈)被当作一个字节的数量。此处可以省略修饰符,
因为它$0是一个无符号的数字(
let data = Data(bytes: [0, 1, 127, 128, 255])print(data.hexEnpredString()) // 00017f80ffprint(data.hexEnpredString(options: .upperCase)) // 00017F80FF
),并且不会出现符号扩展名
,但是将其保留在其中也无害。

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

例:

extension Data {    struct HexEncodingOptions: OptionSet {        let rawValue: Int        static let upperCase = HexEncodingOptions(rawValue: 1 << 0)    }    func hexEnpredString(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)    }}

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



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5171467.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-18
下一篇 2022-11-18

发表评论

登录后才能评论

评论列表(0条)

保存