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

以二进制格式输出对象

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 4Ojw&ys@V  
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 KPhqD5, (  
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 SJ-Sac58r  
象当作char数组来处理。 ]lY9[~ v  
template<class Container> loJ0PY'}=  
class bit_iterator : public std::iterator<bidirectional_iterator_tag, wGH@I_cy>  
void, void> DPOPRi~  
{ Ah`dt8t  
public: 4@I]PG  
explicit bit_iterator(Container& c) : m_container(&c) s$_#T  
{ K36B9<F  
m_size = 8*sizeof(Container); g]#Wve  
m_index = 0; _;{-w%Vf  
} qg/5m;U  
explicit bit_iterator() : m_container(0) I .ty-X]  
{ z"#.o^5  
m_size = 8*sizeof(Container); !)=o,sVA  
m_index = m_size; CmOb+:4@K  
} @gc"-V*-/  
bool operator* () ;GS JnV  
{ fLAF/#\2  
char mask = 1; UJ[a& b  
char* pc = (char*)m_container; $EIkk= z  
int i   = (m_size-m_index-1)/8; D,/9rH  
int off   = (m_size-m_index-1)%8; Ah6x2(:  
mask <<=off; 08a|]li  
return pc & mask; [Bo$?  
} ihrrmlN?  
bit_iterator<Container>& operator++() B(LV22#  
{ val<N293L>  
m_index++; (T01hR&  
return *this; t,,^^ll  
} v"+EBfx  
bit_iterator<Container>& operator++(int)  $wTX  
{ .)w0C%]  
m_index++; `uHpj`EU  
return *this; G m! ]   
} F948%?a  
bool operator==(bit_iterator<Container>& bitIt) {@Ac L:Eit  
{ o=QF>\ \  
return m_index == bitIt.m_index; 1\0@?6`^  
} <*(R+to^d  
bool operator!=(bit_iterator<Container>& bitIt) @ `D6F;R  
{ lv*uXg.k^  
return !(*this == bitIt); 9,CC1f  
} . $YF|v[=  
protected: vM/v}6;_K2  
Container* m_container; 5nAF=Bj  
private: [ )~@NN  
int m_size; 1.uQ(>n  
int m_index; su;S)yZb  
}; a7G2C oM8  
>>zoG3H!  
用该迭代器可以将任意类型对象以二进制格式输出: KCE-6T  
double a = 10; d Al<'~g  
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
描述
快速回复

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