C++ 中实现 PHP pack(‘H’) 功能的完整指南

13次阅读

C++ 中实现 PHP pack(‘H’) 功能的完整指南

#%#$#%@%@%$#%$#%#%#$%@_e1bfd762321e409c++ee4ac0b6e841963c 的 `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  #include  #include  #include  #include   std::vector 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 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 函数,更简洁高效:

#include  #include   std::vector hexStringToBytes_CppBuilder(const UnicodeString& hex) {     std::vector result(hex.Length() / 2);     int len = HexToBin(hex.c_str(), result.data(), static_cast(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免费学习笔记(深入)”;

text=ZqhQzanResources