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

以二进制格式输出对象

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 W2CCLq1(  
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 0/".2(\}T  
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 bVE t?E*+  
象当作char数组来处理。 Ood8Qty(  
template<class Container> K)m\xzT/  
class bit_iterator : public std::iterator<bidirectional_iterator_tag, ?W  l=F/  
void, void> >"^H"K/T  
{ %kM|Hk3d  
public: [i7Ug.Oi"  
explicit bit_iterator(Container& c) : m_container(&c) L B:wo .X  
{ J&%d(EJM  
m_size = 8*sizeof(Container); U%2[,c_  
m_index = 0; _wa1R+`_  
} {fi:]|<1h  
explicit bit_iterator() : m_container(0) W'f{u&<  
{ Ey5E1$w%&  
m_size = 8*sizeof(Container); !}u'%  
m_index = m_size; crV2T  
} r^<W$-#  
bool operator* () ?k$3( -  
{ PCxv_Svf  
char mask = 1; i qCZIahf  
char* pc = (char*)m_container; <t9#~x#'b  
int i   = (m_size-m_index-1)/8; %_*q'6K  
int off   = (m_size-m_index-1)%8; B^W0Ik`m  
mask <<=off; 3GkVMYI  
return pc & mask; |Gc2w]\3  
} RS'%;B-)  
bit_iterator<Container>& operator++() p=T,JAIt  
{ Ol8ma`}Nq3  
m_index++; "xS?#^a  
return *this; m791w8Vr  
} 9UD~$_<\  
bit_iterator<Container>& operator++(int) 2Z3c`/k  
{ _7?LINF9  
m_index++; &yFt@g]  
return *this; ~(2G7x)  
} &"vh=Z-  
bool operator==(bit_iterator<Container>& bitIt) 9v_B$F$_T  
{ 0E9LZOw4T  
return m_index == bitIt.m_index; Mz}yf5{f  
} XWQp-H.  
bool operator!=(bit_iterator<Container>& bitIt) joa|5v'  
{ >L6V!  
return !(*this == bitIt); #q`-"2"|  
} F\1{bN|3  
protected: E|!rapa  
Container* m_container; <a@'Pcsk  
private: ;U6z|O7L  
int m_size; \ "193CW!  
int m_index; Vj^<V|=  
}; AplXl=  
pgK)  
用该迭代器可以将任意类型对象以二进制格式输出: 6PETIs  
double a = 10; +we3BE.  
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
描述
快速回复

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