社区应用 最新帖子 精华区 社区服务 会员列表 统计排行 社区论坛任务 迷你宠物
  • 2678阅读
  • 0回复

以二进制格式输出对象

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 -TU7GCb=  
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 @BbZ(cZ*  
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 i@6MO'y  
象当作char数组来处理。 xQ>c.}J/i  
template<class Container> iJ~5A'?6  
class bit_iterator : public std::iterator<bidirectional_iterator_tag, [3nhf<O  
void, void> S5@/;T  
{ 9qIUBHe  
public: SDcxro|8i  
explicit bit_iterator(Container& c) : m_container(&c) ZwAX+0  
{ yHurt>8b[  
m_size = 8*sizeof(Container); j2cLb  
m_index = 0; <P'^olQ  
} df nmUE  
explicit bit_iterator() : m_container(0) DIB Az s  
{ =$}P'[V  
m_size = 8*sizeof(Container); b=9(gZ 9  
m_index = m_size; |VB}Kv  
} `)`_G!a  
bool operator* () D%LqLLD  
{ o$'Fz[U  
char mask = 1; >-r\]/^  
char* pc = (char*)m_container; 95_ ?F7}9  
int i   = (m_size-m_index-1)/8; SIKy8?Fn  
int off   = (m_size-m_index-1)%8; 3I^KJ/)A  
mask <<=off; brb8C%j}9  
return pc & mask; zid?yuP  
} #E2`KGCzW  
bit_iterator<Container>& operator++() bS3qX{5  
{ c,Zs. kC  
m_index++; "6~pTHT  
return *this; e!l!T@ pf  
} st{:] yTRk  
bit_iterator<Container>& operator++(int) Y">Q16(  
{ D ,mFme  
m_index++; N ]}Re$5  
return *this; X-3L4@T:?  
} C]W VH\P p  
bool operator==(bit_iterator<Container>& bitIt) (*/P~$xIj  
{ N,(@k[uta  
return m_index == bitIt.m_index; vn .wM  
} {Xwin $C  
bool operator!=(bit_iterator<Container>& bitIt) 1;fs`k0p  
{ (8GJLs 8  
return !(*this == bitIt); %N/I;`  
} ;p BXAl  
protected: XC?H  
Container* m_container; jS5e"LMIq  
private: J%aW^+O  
int m_size; '&?47+W  
int m_index; c[sC 2  
}; b[uTt'p}  
UldKlQ8  
用该迭代器可以将任意类型对象以二进制格式输出: vW"x)~B  
double a = 10; }C/}8<  
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
描述
快速回复

您目前还是游客,请 登录注册
欢迎提供真实交流,考虑发帖者的感受
认证码:
验证问题:
10+5=?,请输入中文答案:十五