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

以二进制格式输出对象

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 9HG"}CGZP  
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 3}x6IM 2  
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 RWdx) qj{  
象当作char数组来处理。 ^Kj xQO6y3  
template<class Container> :~LOw}N!aQ  
class bit_iterator : public std::iterator<bidirectional_iterator_tag, Po7oo9d  
void, void> F ,h}HlU  
{ 2U rE>_  
public: }cd-BW  
explicit bit_iterator(Container& c) : m_container(&c) ROj9#:  
{ x>[f+Tc  
m_size = 8*sizeof(Container); C3-I5q(V]  
m_index = 0; l;vA"b=]  
} GEZ!z5";BQ  
explicit bit_iterator() : m_container(0) P.'$L\  
{ naiy] oY"  
m_size = 8*sizeof(Container); ku^0bq}BrH  
m_index = m_size; @i>o+>V  
} o0#zk  
bool operator* () IIUTo  
{ 7~2V5 @{<  
char mask = 1; 2O " ~k  
char* pc = (char*)m_container; dEK bB  
int i   = (m_size-m_index-1)/8; ,Lr}P  
int off   = (m_size-m_index-1)%8; G4QsR7  
mask <<=off; mExJ--}  
return pc & mask; #bCzWg  
} #waK^B)<a  
bit_iterator<Container>& operator++() f ( ug3(j  
{ =:(<lKf,<F  
m_index++; Azag*M?  
return *this; G[s/M\l  
} 4{#0ci{  
bit_iterator<Container>& operator++(int) -|( q 9B  
{ ggHz-oNY  
m_index++; ](SqLTB+?  
return *this; (tz fyZ M  
} GpGq' 8|(  
bool operator==(bit_iterator<Container>& bitIt) ^k4 n  
{ O+PRP"$g"  
return m_index == bitIt.m_index; &D#B"XI  
} yYPFk  
bool operator!=(bit_iterator<Container>& bitIt) g{^(EZ,  
{ C0-,<X  
return !(*this == bitIt); ydf;g5OZ  
} 2/RW(U  
protected: !Tu4V\^~A  
Container* m_container; 'OvyQ/T  
private: ^/"2s}+  
int m_size; 3TF'[(K=  
int m_index; W0s3nio  
}; p ^U#1c  
{^6<Ohe4j  
用该迭代器可以将任意类型对象以二进制格式输出: _v +At;Y  
double a = 10; a.B<W9$`  
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
描述
快速回复

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