
php 的 `pack('h*', $hexstring)` 将十六进制字符串(如 `"01"`)解析为对应的二进制字节序列(如单字节 `\x01`);c++ 中可通过标准库流操作、`sscanf` 或 c++builder 特有函数实现等效逻辑。
在 PHP 中,pack('H*', $tagIdAsHex) 的作用并非“编码”,而是将表示字节的十六进制字符串(不带前缀、偶数长度)解码为原始二进制数据。例如:
- 输入 "01" → 输出字节 0x01(即 std::vector
{0x01}) - 输入 "DEADBEAF" → 输出 std::vector
{0xDE, 0xAD, 0xBE, 0xAF}
这与 sprintf("%02X", n) 的“整数转十六进制字符串”方向相反,属于十六进制字符串到字节数组的解析(hex decode)。
✅ 推荐方案:使用标准 C++(跨平台、无依赖)
#include <string>
#include <vector>
#include <sstream>
#include <iomanip>
#include <cctype>
std::vector<uint8_t> hexStringToBytes(const std::string& hex) {
// 移除空格、确保长度为偶数
std::string cleaned;
for (char c : hex) {
if (std::isxdigit(c)) cleaned += std::toupper(c);
}
if (cleaned.size() % 2 != 0) {
throw std::invalid_argument("Hex string length must be even");
}
std::vector<uint8_t> bytes;
bytes.reserve(cleaned.size() / 2);
for (size_t i = 0; i < cleaned.size(); i += 2) {
std::string byteStr = cleaned.substr(i, 2);
uint8_t byte;
std::istringstream iss("0x" + byteStr);
iss >> std::hex >> byte;
if (iss.fail()) throw std::invalid_argument("Invalid hex character");
bytes.push_back(byte);
}
return bytes;
}
// 使用示例:
int main() {
uint8_t tagId = 1;
std::string hexStr = "01"; // 等价于 PHP 中 sprintf("%02X", tagId)
auto binary = hexStringToBytes(hexStr); // 得到 {0x01}
// 验证:binary[0] == 0x01
return 0;
}⚠️ 注意事项
- PHP 的 pack('H*', ...) 忽略大小写和空白字符,建议先预处理(如上例中的 cleaned 步骤);
- 输入必须为偶数长度十六进制字符(每 2 字符对应 1 字节),否则逻辑错误;
- 不要混淆 pack('H*') 与 pack('N') 等其他模板——'H*' 专指 hex 解码,非网络序编码。
? C++Builder 用户快捷方案(仅限 Embarcadero 平台)
若使用 C++Builder,可直接调用 RTL 函数,更简洁高效:
刚开始接触模版引擎的 PHP 设计师,听到 Smarty 时,都会觉得很难。其实笔者也不例外,碰都不敢碰一下。但是后来在剖析 XOOPS 的程序架构时,开始发现 Smarty 其实并不难。只要将 Smarty 基础功练好,在一般应用上就已经相当足够了。当然基础能打好,后面的进阶应用也就不用怕了。 这篇文章的主要用意并非要深入探讨 Smarty 的使用,这在官方使用说明中都已经写得很完整了。笔
#include <System.Classes.hpp>
#include <vector>
std::vector<uint8_t> hexStringToBytes_CppBuilder(const UnicodeString& hex) {
std::vector<uint8_t> result(hex.Length() / 2);
int len = HexToBin(hex.c_str(), result.data(), static_cast<int>(result.size()));
if (len < 0) throw std::runtime_error("HexToBin failed");
result.resize(len);
return result;
}✅ 总结
| 场景 | 推荐方法 |
|---|---|
| 跨平台、标准 C++ 项目 | std::istringstream + std::hex 循环解析(如上) |
| 高性能/大量解析 | 手写查表法(256 项 ASCII→nibble 映射) |
| C++Builder 专属项目 | HexToBin()(需包含 |
无需引入第三方库,纯标准 C++ 即可精准复现 PHP pack('H*') 的语义:将十六进制字符串安全、健壮地还原为原始字节序列。
立即学习“PHP免费学习笔记(深入)”;










