寻找与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
相关产品推荐
相关产品推荐

