如何将十六进制字符串转换为存储十六进制字节的unsigned char数组
C++ 十六进制字符串转字节数组实现方案
核心逻辑
十六进制字符串每2个字符对应1个字节,逐2位读取字符转换为对应数值后拼接为单字节即可。
完整实现代码
#include <iostream> #include <string> #include <vector> #include <stdexcept> #include <cstdint> #include <cstdio> // 单个十六进制字符转对应数值 uint8_t hexCharToValue(char c) { if (c >= '0' && c <= '9') return c - '0'; if (c >= 'a' && c <= 'f') return 10 + c - 'a'; if (c >= 'A' && c <= 'F') return 10 + c - 'A'; throw std::invalid_argument("存在非十六进制字符"); } // 转换入口:输入十六进制字符串,返回动态字节数组 std::vector<uint8_t> hexStrToByteArray(const std::string& hexStr) { if (hexStr.length() % 2 != 0) { throw std::invalid_argument("十六进制字符串长度不能为奇数"); } std::vector<uint8_t> byteArray; byteArray.reserve(hexStr.length() / 2); for (size_t i = 0; i < hexStr.length(); i += 2) { uint8_t highBit = hexCharToValue(hexStr[i]); uint8_t lowBit = hexCharToValue(hexStr[i + 1]); byteArray.push_back((highBit << 4) | lowBit); } return byteArray; } // 使用示例 int main() { std::string hexStr = "fc4883e4f0e8"; try { std::vector<uint8_t> myHexArray = hexStrToByteArray(hexStr); // 输出验证转换结果 std::cout << "转换后数组:{ "; for (size_t i = 0; i < myHexArray.size(); ++i) { if (i != 0) std::cout << ", "; printf("0x%02x", myHexArray[i]); } std::cout << " }" << std::endl; // 如需裸unsigned char指针直接调用data()即可,用法和静态数组完全一致 unsigned char* rawArray = myHexArray.data(); size_t arrayLength = myHexArray.size(); } catch (const std::exception& e) { std::cerr << "转换失败: " << e.what() << std::endl; return 1; } return 0; }
说明
std::vector<uint8_t>是C++标准库的动态数组,内存连续且自动管理生命周期,和C#中List<byte>用法高度相似- 代码兼容C++11及以上所有版本,主流GCC、Clang、MSVC编译器都可直接编译运行
- 如果需要编译期静态数组,可提前通过脚本把十六进制字符串转换为静态数组初始化语法,运行期动态构造场景使用上述方案即可
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

