C++中uint8_t数组赋值后bitset输出报错:bitset::_M_copy_from_ptr
问题原因
你遇到的bitset::_M_copy_from_ptr错误,根源是**std::bitset没有接受uint8_t数组(或其退化指针)的构造函数**。当你写bitset<24>(arr)时,数组arr会退化为uint8_t*,编译器会尝试匹配bitset的const char*构造函数,导致指针类型不兼容,进而触发内部拷贝逻辑的错误。
另外你的代码还存在一个小问题:没有使用std::前缀调用cout,因为你没有声明using namespace std;,这会导致编译错误。
解决方案
要将uint8_t数组转为24位二进制字符串,有两种常用方法:
方法1:拼接为整数后转bitset
将3个uint8_t元素通过位运算拼接成一个24位的整数,再传入bitset:
#include <iostream> #include <bitset> #include <cstdint> int main() { uint8_t arr[3]{0}; uint8_t currBlock{arr[0]}; int flag{1}; currBlock ^= (-flag ^ arr[0]) & (1UL << 3); // 拼接数组为24位整数(arr[0]为最高8位,arr[2]为最低8位) uint32_t combined = (static_cast<uint32_t>(arr[0]) << 16) | (static_cast<uint32_t>(arr[1]) << 8) | arr[2]; std::cout << "Buffer is : " << std::bitset<24>(combined).to_string() << std::endl; arr[0] = currBlock; combined = (static_cast<uint32_t>(arr[0]) << 16) | (static_cast<uint32_t>(arr[1]) << 8) | arr[2]; std::cout << "Buffer is : " << std::bitset<24>(combined).to_string() << std::endl; return 0; }
方法2:逐个元素转二进制后拼接
直接将每个uint8_t元素转为8位二进制字符串,再按顺序拼接:
#include <iostream> #include <bitset> #include <cstdint> #include <string> int main() { uint8_t arr[3]{0}; uint8_t currBlock{arr[0]}; int flag{1}; currBlock ^= (-flag ^ arr[0]) & (1UL << 3); // 拼接每个元素的二进制字符串 std::string bits; for (int i = 0; i < 3; ++i) { bits += std::bitset<8>(arr[i]).to_string(); } std::cout << "Buffer is : " << bits << std::endl; arr[0] = currBlock; bits.clear(); for (int i = 0; i < 3; ++i) { bits += std::bitset<8>(arr[i]).to_string(); } std::cout << "Buffer is : " << bits << std::endl; return 0; }
输出结果
两种方法都会输出符合预期的结果:
Buffer is : 000000000000000000000000 Buffer is : 000010000000000000000000
内容的提问来源于stack exchange,提问作者sayonara
相关产品推荐
相关产品推荐

