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

以二进制格式输出对象

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 =?f\o*J)  
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 yA+:\%y$  
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 fK|F`F2V  
象当作char数组来处理。 *gC6yQ2?  
template<class Container> 5M2G ;o  
class bit_iterator : public std::iterator<bidirectional_iterator_tag, K?q1I<94  
void, void> sCFqz[I  
{ {uRnZ/m  
public: 7usf^g[dh  
explicit bit_iterator(Container& c) : m_container(&c) ` AA[k  
{ eJrJ5mlI`  
m_size = 8*sizeof(Container); H}QOoXWkg  
m_index = 0; b_]14 v  
} D@(Y.&_  
explicit bit_iterator() : m_container(0)  `Up Zk?k  
{ {g *kr1JM  
m_size = 8*sizeof(Container); Yl+r>+^  
m_index = m_size; W|@/<K$V  
} {Ah\-{]  
bool operator* () r~uWr'}a}  
{ Y.qlY3iBp  
char mask = 1; +_ HPZo  
char* pc = (char*)m_container; zF2GW  
int i   = (m_size-m_index-1)/8; joh=0nk;D  
int off   = (m_size-m_index-1)%8; <=*xwI&q  
mask <<=off; q*oUd/F8  
return pc & mask; 1B;sSp.>  
} 2rq)U+   
bit_iterator<Container>& operator++() *1}'ZEaJ  
{ Z4/rqU  
m_index++; 40}8EP k)  
return *this; Brh<6Btl  
} b<B|p|  
bit_iterator<Container>& operator++(int) $*bd})y)I  
{ E+AEV`-  
m_index++; >uuP@j  
return *this; 37wm[ Z  
} z&o"K\y\  
bool operator==(bit_iterator<Container>& bitIt) 5Y 4W:S  
{ I% 43rdoPe  
return m_index == bitIt.m_index; +1 H.5|  
} ^<R*7mB*  
bool operator!=(bit_iterator<Container>& bitIt) !+4}x;!8  
{ y8Bi5Ae,+1  
return !(*this == bitIt); }MDuQP]  
} ->x+ p"  
protected: qHfs*MBJ%  
Container* m_container; m Kwhd} V  
private: dQR2!yHEq  
int m_size; x)wIGo  
int m_index; XX5 ):1  
}; %Lexu)odW  
50oNN+; =R  
用该迭代器可以将任意类型对象以二进制格式输出: UDHk@M  
double a = 10; |*0oz=  
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
描述
快速回复

您目前还是游客,请 登录注册
温馨提示:欢迎交流讨论,请勿纯表情、纯引用!
认证码:
验证问题:
10+5=?,请输入中文答案:十五