
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
⚙️ C++Builder 专用方案(RTL 函数)
若在 Embarcadero C++Builder 环境中开发,可直接调用 RTL 提供的 HexToBin():
BJXShop网上购物系统是一个高效、稳定、安全的电子商店销售平台,经过近三年市场的考验,在中国网购系统中属领先水平;完善的订单管理、销售统计系统;网站模版可DIY、亦可导入导出;会员、商品种类和价格均实现无限等级;管理员权限可细分;整合了多种在线支付接口;强有力搜索引擎支持... 程序更新:此版本是伴江行官方商业版程序,已经终止销售,现于免费给大家使用。比其以前的免费版功能增加了:1,整合了论坛
立即学习“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
{tagId} —— 但此方式不等价于完整 pack('H*') 流程,仅适用于已知数值范围的简化场景。
✅ 总结:最通用、可移植的 C++ 等效实现是「std::istringstream + std::hex」解析法,它精准复现了 PHP pack('H*') 的语义:将规范十六进制字符串无损还原为原始二进制字节流。










