You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

寻找与PHP pack()方法效果一致的Swift替代实现方案

Swift 实现 PHP pack('H*') 等效方法

功能说明

PHP 的 pack('H*', 十六进制字符串) 作用是将十六进制字符串逐字节转换为原始二进制字节流,每2个十六进制字符对应1个字节,高位在前。

完整实现代码

import Foundation

func packH(hexString: String) -> Data? {
    // 清洗输入:过滤非十六进制字符,统一转为小写
    let cleanedHex = hexString.lowercased().filter { "0123456789abcdef".contains($0) }
    // 十六进制字符串长度必须为偶数才能逐字节转换
    guard cleanedHex.count % 2 == 0 else { return nil }
    
    var data = Data()
    var currentIndex = cleanedHex.startIndex
    
    while currentIndex < cleanedHex.endIndex {
        let nextIndex = cleanedHex.index(currentIndex, offsetBy: 2)
        let byteSubstring = cleanedHex[currentIndex..<nextIndex]
        // 每2个十六进制字符转换为1个UInt8字节
        guard let byte = UInt8(byteSubstring, radix: 16) else {
            return nil
        }
        data.append(byte)
        currentIndex = nextIndex
    }
    return data
}

效果验证

对应PHP示例代码

// 输出结果为 AQ==
echo base64_encode(pack('H*', sprintf("%02X",1)));

Swift侧测试代码

// 生成1对应的2位十六进制字符串 "01"
let targetHex = String(format: "%02X", 1)
if let packedData = packH(hexString: targetHex) {
    let base64Result = packedData.base64EncodedString()
    print(base64Result) // 输出 AQ==,和PHP运行结果完全一致
}

对比说明

如果直接对十六进制字符串"01"本身做UTF8编码后再Base64编码,会得到结果MDE=,和你给出的sprintf直接编码的对比示例一致。


内容的提问来源于stack exchange,提问作者jawad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 21:27:02