bitset崩溃

combobox2013 2013-07-26 09:28:22
byte testBytes[5]={0x1,0x2,0x3,0x4,0x0}; //vc环境下

std::string strHelp((char*)testBytes);
#if 1
int nTemp=strHelp.length(); //nTemp==4 ?
#endif
std::bitset<40> temp2(strHelp); //崩溃



template<class _Elem,
class _Tr,
class _Alloc>
explicit bitset(const basic_string<_Elem, _Tr, _Alloc>& _Str,
_BITSET_SIZE_TYPE _Pos = 0)
{ // construct from [_Pos, ...) elements in string
_Construct(_Str, _Pos,
basic_string<_Elem, _Tr, _Alloc>::npos, (_Elem)'0');
}

最终导致

void _Xinv() const
{ // report invalid string element in bitset conversion
_THROW(invalid_argument, "invalid bitset<N> char");
}
抛出异常



需求: 用bitset模版类去操作字节数组testBytes!


...全文
186 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
图灵狗 2013-07-26
  • 打赏
  • 举报
回复
字节和位操作不要混用,核心是你要搞清楚C语言中最小的操作单位是字节,位运算只是去改变某些位,而不是直接得到位值,最起码也是一个unsigned char类型的值,建议先看看位运算的知识。
引用 6 楼 combobox2013 的回复:
[quote=引用 5 楼 u010936098 的回复:] [quote=引用 2 楼 combobox2013 的回复:] 用bitset模版类去操作字节数组testBytes!,这是需求, 由于bitset 的构造函数 的版本 只有3个吧, 其中一个是 std::string 所以我才想,用string来过渡,没想到崩溃了。 怎么解决呢? 我想用bitset去操作testBytes这个字节数组里的某些位!!!
用什么方法来处理字节数组中的二进制位,这是属于实现的范畴,怎么会是需求呢? “用bitset模版类去操作字节数组testBytes”,那么需要从字节数组构造出正确的bitset、对bitset进行操作、然后还要用bitset中的数据去更改字节数组。这样做还不如自己写个类去直接操作字节数组中的二进制位更简单。 如果你一定要用字节数组中的二进制位构造bitset,只能向下面这样:

    byte testBytes[5]= {0x1,0x2,0x3,0x4,0x0};

    std::bitset<40> temp2;
    unsigned int n = 0;
    for( unsigned int i = 0; i < 5; ++ i)
    {
        for( unsigned int j = 0; j < 8; ++ j)
        {
            temp2[n] = testBytes[i] >> j;
            ++ n;
        }
    }
[/quote] 不对啊,我提供一个数组进行测试:

	byte testBytes[4]={0xDA, 0xA8, 0xB4,0x00};		//即二进制:1011  0100  1010  1000  1101  1010

	std::bitset<32> temp2;  //已经改成32位的了
	unsigned int n = 0;
	for( unsigned int i = 0; i < 32/8; ++ i)
	{
		for( unsigned int j = 0; j < 8; ++ j)
		{
			temp2[n] = testBytes[i] >> j;
			++ n;
		}
	}
	return 0;


temp2 = [32](1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0)
[/quote]
combobox2013 2013-07-26
  • 打赏
  • 举报
回复
引用 8 楼 combobox2013 的回复:
[quote=引用 7 楼 nice_cxf 的回复:] bitset一点也不实用,理解原理了自己实现一个类似的把
我已经用了bitset进行操作位了, 代码都写好了,只是“将字节数组转换为bitset的时候出错了”,能帮忙解答一下吗? [/quote] 搞定了: 修改为: temp2[n] = (testBytes[i] >> j)& 0x01; 结贴
combobox2013 2013-07-26
  • 打赏
  • 举报
回复
引用 7 楼 nice_cxf 的回复:
bitset一点也不实用,理解原理了自己实现一个类似的把
我已经用了bitset进行操作位了, 代码都写好了,只是“将字节数组转换为bitset的时候出错了”,能帮忙解答一下吗?
nice_cxf 2013-07-26
  • 打赏
  • 举报
回复
bitset一点也不实用,理解原理了自己实现一个类似的把
combobox2013 2013-07-26
  • 打赏
  • 举报
回复
引用 5 楼 u010936098 的回复:
[quote=引用 2 楼 combobox2013 的回复:] 用bitset模版类去操作字节数组testBytes!,这是需求, 由于bitset 的构造函数 的版本 只有3个吧, 其中一个是 std::string 所以我才想,用string来过渡,没想到崩溃了。 怎么解决呢? 我想用bitset去操作testBytes这个字节数组里的某些位!!!
用什么方法来处理字节数组中的二进制位,这是属于实现的范畴,怎么会是需求呢? “用bitset模版类去操作字节数组testBytes”,那么需要从字节数组构造出正确的bitset、对bitset进行操作、然后还要用bitset中的数据去更改字节数组。这样做还不如自己写个类去直接操作字节数组中的二进制位更简单。 如果你一定要用字节数组中的二进制位构造bitset,只能向下面这样:

    byte testBytes[5]= {0x1,0x2,0x3,0x4,0x0};

    std::bitset<40> temp2;
    unsigned int n = 0;
    for( unsigned int i = 0; i < 5; ++ i)
    {
        for( unsigned int j = 0; j < 8; ++ j)
        {
            temp2[n] = testBytes[i] >> j;
            ++ n;
        }
    }
[/quote] 不对啊,我提供一个数组进行测试:

	byte testBytes[4]={0xDA, 0xA8, 0xB4,0x00};		//即二进制:1011  0100  1010  1000  1101  1010

	std::bitset<32> temp2;  //已经改成32位的了
	unsigned int n = 0;
	for( unsigned int i = 0; i < 32/8; ++ i)
	{
		for( unsigned int j = 0; j < 8; ++ j)
		{
			temp2[n] = testBytes[i] >> j;
			++ n;
		}
	}
	return 0;


temp2 = [32](1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0)
橡木疙瘩 2013-07-26
  • 打赏
  • 举报
回复
引用 2 楼 combobox2013 的回复:
用bitset模版类去操作字节数组testBytes!,这是需求, 由于bitset 的构造函数 的版本 只有3个吧, 其中一个是 std::string 所以我才想,用string来过渡,没想到崩溃了。 怎么解决呢? 我想用bitset去操作testBytes这个字节数组里的某些位!!!
用什么方法来处理字节数组中的二进制位,这是属于实现的范畴,怎么会是需求呢? “用bitset模版类去操作字节数组testBytes”,那么需要从字节数组构造出正确的bitset、对bitset进行操作、然后还要用bitset中的数据去更改字节数组。这样做还不如自己写个类去直接操作字节数组中的二进制位更简单。 如果你一定要用字节数组中的二进制位构造bitset,只能向下面这样:

    byte testBytes[5]= {0x1,0x2,0x3,0x4,0x0};

    std::bitset<40> temp2;
    unsigned int n = 0;
    for( unsigned int i = 0; i < 5; ++ i)
    {
        for( unsigned int j = 0; j < 8; ++ j)
        {
            temp2[n] = testBytes[i] >> j;
            ++ n;
        }
    }
combobox2013 2013-07-26
  • 打赏
  • 举报
回复
引用 3 楼 jaff20071234 的回复:
If any characters examined in str are not zero or one, it throws std::invalid_argument.
如何解决我的需求?
shawn 2013-07-26
  • 打赏
  • 举报
回复
If any characters examined in str are not zero or one, it throws std::invalid_argument.
combobox2013 2013-07-26
  • 打赏
  • 举报
回复
引用 1 楼 u010936098 的回复:
byte testBytes[5]={0x1,0x2,0x3,0x4,0x0}; //vc环境下

std::string strHelp((char*)testBytes);
#if 1
int nTemp=strHelp.length(); //nTemp==4 ?
#endif
std::bitset<40> temp2(strHelp); //崩溃
你要构造一个什么样的bitset? 使用string类型构造bitset时,string中应该只有字符'0'和'1’,'0'表示该位为0,‘1'表示该位为1。你的string中的四个字符全都是非法字条。
用bitset模版类去操作字节数组testBytes!,这是需求, 由于bitset 的构造函数 的版本 只有3个吧, 其中一个是 std::string 所以我才想,用string来过渡,没想到崩溃了。 怎么解决呢? 我想用bitset去操作testBytes这个字节数组里的某些位!!!
橡木疙瘩 2013-07-26
  • 打赏
  • 举报
回复
byte testBytes[5]={0x1,0x2,0x3,0x4,0x0}; //vc环境下

std::string strHelp((char*)testBytes);
#if 1
int nTemp=strHelp.length(); //nTemp==4 ?
#endif
std::bitset<40> temp2(strHelp); //崩溃
你要构造一个什么样的bitset? 使用string类型构造bitset时,string中应该只有字符'0'和'1’,'0'表示该位为0,‘1'表示该位为1。你的string中的四个字符全都是非法字条。

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧