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

以二进制格式输出对象

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 FTsvPLIv"  
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 ?V3e;n  
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 QJjqtOf>  
象当作char数组来处理。 h%9#~gJ})  
template<class Container> ZG"_M@S.  
class bit_iterator : public std::iterator<bidirectional_iterator_tag, 5L'X3g  
void, void> s,)Z8H  
{ 9s7sn*aB#5  
public: M<4~ewWJ  
explicit bit_iterator(Container& c) : m_container(&c) ssUWr=mD  
{ -J[*fv@  
m_size = 8*sizeof(Container); sFuB[ JJ}  
m_index = 0; 4[v %]g`  
} IZoS2^:yw  
explicit bit_iterator() : m_container(0) !8(: G6Ne  
{ 9{]U6A*K0w  
m_size = 8*sizeof(Container); vlY83mU.  
m_index = m_size; bk44 qL;8  
} JmjqA Dex  
bool operator* () :q/%uca9  
{ K!;Z#$iw[  
char mask = 1; 9@/ X;zO  
char* pc = (char*)m_container; 6w|s1!B l  
int i   = (m_size-m_index-1)/8; >|'u:`A  
int off   = (m_size-m_index-1)%8; #`?B:  
mask <<=off; 7VduewKX8  
return pc & mask; yY_Zq\   
} p"\Z@c  
bit_iterator<Container>& operator++() JvX]^t/}  
{ .zZee,kM  
m_index++; s]@()?.E$  
return *this; b"DaLwKkz  
} L3/m}AH,  
bit_iterator<Container>& operator++(int) F !g>fIg  
{ o'O;69D]tX  
m_index++; LVP2jTz  
return *this; 38#BINhBt  
} wc`UcGO  
bool operator==(bit_iterator<Container>& bitIt) nLicog)!I  
{ F!(Vg  
return m_index == bitIt.m_index; H0r@dn  
} I7,5ID4pn  
bool operator!=(bit_iterator<Container>& bitIt) F,5~a_GP?  
{ '_oWpzpe  
return !(*this == bitIt); %? -E)n[  
} BJC$KmGk  
protected: $P rji  
Container* m_container; c&me=WD  
private: z-ns@y(f@X  
int m_size; *oZ]k`-!8  
int m_index; .^ djt  
}; &8$Gy u  
c_wvuKa  
用该迭代器可以将任意类型对象以二进制格式输出: o{MF'B #  
double a = 10; +L(|?|i8  
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
描述
快速回复

您目前还是游客,请 登录注册
批量上传需要先选择文件,再选择上传
认证码:
验证问题:
10+5=?,请输入中文答案:十五