
php 的 `pack('h*', $hexstring)` 将十六进制字符串(如 `"01"`)解析为对应的二进制字节序列(如 `"\x01"`)。在 c++ 中,可通过标准库流操作、`sscanf` 或 c++builder 特有函数实现等效转换。
PHP 代码中:
$tagId = 1;
$tagIdAsHex = sprintf("%02X", $tagId); // → "01"
$tagAsHexBytes = pack('H*', $tagIdAsHex); // → binary string of length 1: \x01其本质是两步:
- 整数 → 大写两位十六进制字符串(如 1 → "01");
- 十六进制字符串 → 二进制字节序列(如 "01" → {0x01})。
✅ 标准 C++ 实现(跨平台、推荐)
使用 std::istringstream + std::hex 解析偶数长度的十六进制字符串:
#include <string>
#include <vector>
#include <sstream>
#include <iomanip>
#include <stdexcept>
std::vector<uint8_t> hexStringToBytes(const std::string& hex) {
if (hex.length() % 2 != 0) {
throw std::invalid_argument("Hex string length must be even");
}
std::vector<uint8_t> bytes;
bytes.reserve(hex.length() / 2);
for (size_t i = 0; i < hex.length(); i += 2) {
std::string byteStr = hex.substr(i, 2);
unsigned int byteVal;
std::istringstream iss(byteStr);
iss >> std::hex >> byteVal;
if (!iss || byteVal > 0xFF) {
throw std::invalid_argument("Invalid hex byte: " + byteStr);
}
bytes.push_back(static_cast<uint8_t>(byteVal));
}
return bytes;
}
// 示例用法
int main() {
uint8_t tagId = 1;
std::string hexedTag = fmt::format("{:02X}", tagId); // C++20: std::format;或用 std::ostringstream
auto binaryBytes = hexStringToBytes(hexedTag); // → {0x01}
// 验证:binaryBytes.size() == 1, binaryBytes[0] == 0x01
}? 提示:若未使用 C++20 std::format,可用 std::ostringstream 生成十六进制字符串:std::ostringstream oss; oss << std::uppercase << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(tagId); std::string hexedTag = oss.str();
⚙️ C++Builder 专用方案(RTL 函数)
若在 Embarcadero C++Builder 环境中开发,可直接调用 RTL 提供的 HexToBin():
立即学习“PHP免费学习笔记(深入)”;
#include <System.Classes.hpp>
#include <vector>
std::vector<uint8_t> hexStringToBytes_Builder(const AnsiString& hex) {
std::vector<uint8_t> buffer(hex.Length() / 2);
int actualLen = HexToBin(hex.c_str(), buffer.data(), buffer.size());
if (actualLen < 0) {
throw std::runtime_error("HexToBin failed");
}
buffer.resize(actualLen);
return buffer;
}⚠️ 注意事项:
- 输入十六进制字符串必须为偶数长度,且仅含 0–9、A–F、a–f 字符;
- pack('H*') 在 PHP 中忽略空格与大小写,标准 C++ 实现需自行预处理(如 erase(remove_if(...)));
- HexToBin() 要求输入为 AnsiString 或 WideString,且不校验非法字符——建议前置验证;
- 若原始值始终是单字节整数(如 tagId = 1),可跳过字符串转换,直接赋值:std::vector<uint8_t>{tagId} —— 但此方式不等价于完整 pack('H*') 流程,仅适用于已知数值范围的简化场景。
✅ 总结:最通用、可移植的 C++ 等效实现是「std::istringstream + std::hex」解析法,它精准复现了 PHP pack('H*') 的语义:将规范十六进制字符串无损还原为原始二进制字节流。











