C++ std::bitset<32>传入长度4字符串抛出_M_copy_from_ptr错误原因咨询
异常原因说明
这个异常是std::bitset的字符串构造函数的逻辑限制导致的,和字符串长度没有直接关系:
std::bitset接收std::string作为入参的构造函数,要求输入字符串必须仅由ASCII字符'0'(对应ASCII码0x30)和'1'(对应ASCII码0x31)组成,用来表示人类可读的二进制文本。比如要表示十进制数5,对应的入参应该是文本字符串"101",而不是数值5本身的4字节原生存储内容。- 你当前从RocksDB Slice转换得到的长度为4的字符串,本质是32位整数的原生字节存储序列,每个字节的取值范围是0x00~0xFF,几乎不可能刚好全是
'0'或'1'的ASCII码值。bitset遍历字符串检查到不符合要求的字符时,就会抛出invalid_argument类型的异常,对应你看到的_M_copy_from_ptr报错。
正确实现方案
如果要把4字节原生整数序列转为std::bitset,应该先将字符串内容转换为整数类型再传入构造函数,参考代码如下:
std::string str = rocksDBSlice.ToString(); // 先判断长度符合预期,再做转换 if (str.size() == 4) { // 注意:如果RocksDB存储的字节序和当前运行环境字节序不一致,需要先做字节序转换 uint32_t int_val = *reinterpret_cast<const uint32_t*>(str.data()); std::bitset<32> bits(int_val); std::cout << bits.to_string() << std::endl; }
内容的提问来源于stack exchange,提问作者user997112
相关产品推荐
相关产品推荐

