C++中如何将二进制字符串vector转换为uint8_t类型vector?
Convert Binary String Vector to uint8_t Vector in C++
没问题,这在C++里有几种简洁可靠的实现方式,我给你一步步讲清楚:
核心思路
你的需求是把带0b前缀的二进制字符串转换成对应的uint8_t值,核心步骤就是:
- 去掉每个字符串开头的
0b前缀,提取实际的二进制字符部分 - 将二进制字符串转换为无符号整数
- 把整数强制转换为
uint8_t类型(确保数值在0-255范围内)
方法1:使用std::strtoul(兼容性好)
这是一个适配所有C++版本的方法,依赖C标准库函数,稳定性拉满:
#include <vector> #include <string> #include <cstdint> #include <cstdlib> #include <cstdio> int main() { // 原始二进制字符串vector std::vector<std::string> str_vec = {"0b01100101", "0b01100101", "0b01011101", "0b11001111"}; std::vector<uint8_t> uint_vec; for (const auto& str : str_vec) { // 跳过"0b"前缀,从第2个字符开始取二进制内容 const char* binary_content = str.c_str() + 2; // 用strtoul将二进制字符串转为无符号长整数,基数指定为2 unsigned long converted_val = std::strtoul(binary_content, nullptr, 2); // 转换为uint8_t并加入目标vector uint_vec.push_back(static_cast<uint8_t>(converted_val)); } // 验证转换结果(可选) for (uint8_t val : uint_vec) { printf("0b%08b\n", val); } return 0; }
方法2:使用std::stoull(C++11+风格)
如果你的项目支持C11或更高版本,用std::stoull会更贴合现代C的写法:
#include <vector> #include <string> #include <cstdint> #include <cstdio> int main() { std::vector<std::string> str_vec = {"0b01100101", "0b01100101", "0b01011101", "0b11001111"}; std::vector<uint8_t> uint_vec; for (const auto& str : str_vec) { // 截取"0b"之后的二进制子串 std::string binary_part = str.substr(2); // 转换为无符号长long整数,基数为2 unsigned long long converted_val = std::stoull(binary_part, nullptr, 2); uint_vec.push_back(static_cast<uint8_t>(converted_val)); } // 验证结果 for (uint8_t val : uint_vec) { printf("0b%08b\n", val); } return 0; }
额外提示:添加错误处理
如果你的输入字符串可能存在格式错误(比如没有0b前缀、包含非0/1字符、数值超过8位范围),最好加上错误处理逻辑,避免程序意外崩溃:
#include <vector> #include <string> #include <cstdint> #include <cstdlib> #include <stdexcept> #include <cstdio> int main() { std::vector<std::string> str_vec = {"0b01100101", "0b01100101", "0b01011101", "0b11001111"}; std::vector<uint8_t> uint_vec; for (const auto& str : str_vec) { // 检查字符串格式是否正确 if (str.size() < 3 || str.substr(0, 2) != "0b") { throw std::invalid_argument("Invalid binary string: missing '0b' prefix"); } const char* binary_content = str.c_str() + 2; char* end_ptr; unsigned long converted_val = std::strtoul(binary_content, &end_ptr, 2); // 检查是否所有字符都被成功解析,且数值在uint8_t范围内 if (*end_ptr != '\0') { throw std::invalid_argument("Invalid binary string: contains non-binary characters"); } if (converted_val > UINT8_MAX) { throw std::out_of_range("Binary value exceeds uint8_t range (0-255)"); } uint_vec.push_back(static_cast<uint8_t>(converted_val)); } // 验证结果 for (uint8_t val : uint_vec) { printf("0b%08b\n", val); } return 0; }
内容的提问来源于stack exchange,提问作者CsgoTalks Com
相关产品推荐
相关产品推荐

