原文地址:http://blog.csdn.net/onlyou930/article/details/5602654
圆环套圆环之迭代器
话说这一日是风平浪静,万里乌云,俺的心情好的没得说,收到命令清理A区(写部分代码,其中有在VC6下己完成的代码要移植到VC7下),一路上很轻松,用‘饭得标’的话来说就是‘卡卡’地!在快完成时出现错误。
error C2440: “类型转换” : 无法从“std::vector<_Ty>::iterator”转换为“PPkgHead”
with
[
_Ty=BYTE
]
出错代码PPkgHead pHead = (PPkgHead )m_vPkgRecv.begin();
晕之,在VC6下可以编译通过的呀!看看为啥不让转换呢?看了一下返回值是std::vector::iterator 或是 std::vector::const_iterator , 在begin()后面加了一个点看到了iterator有下面还有一个iterator(果然是圆环套圆环)和加、减、[]等运算符操作,很是郁闷应该怎么转换呢?到vector里看了一下原来是一个类 class iterator 在里面看到了几个函数
const_reference operator*() const
{ // return designated object
return (*_Myptr);
}
const_iterator& operator++()
{ // preincrement
++_Myptr;
return (*this);
}
const_iterator& operator--()
{ // predecrement
--_Myptr;
return (*this);
}
看到这里激动无比呀,可以确定出_Myptr就是当前的指针!修改代码
std::vector::iterator p = m_vPkgRecv.begin();
PPkgHead pHead = (PPkgHead )p._Myptr;
编译通过,哈哈!一直不明白为啥VC7中在P后加点不显示这个成员!另外在网上找到另一个解决方案是PPkgHead pHead = (PPkgHead )&(*m_vPkgRecv.begin());这个强制转换真是强呀,哈哈!不知道兄弟们谁还有更好的方案!
写完程序后看了一下CryptoAPI提供的接口,无意中看到了一个函数CryptCreateHash,这是什么??继续找下去,我立该崩溃了,他他他….居然支持各种Hash运算,签名以及密钥生成!!看了一下它支持MD2,MD4,MD5,SHA,MAC,RSA,DSS,DES,3DES,RC2,RC4,SSL3,AES…..太多了,几乎包括了己知的各种算法!好大的一个棉花糖呀!如何应用这些API呢?!由于要介绍的太多了,我这里以点代面,以MD5算法为例,首先要获得指定CSP的密钥容器的句柄(没有容器的要自己建立),然后就可以用CryptCreateHash创建一个空哈希对象了,其次用CryptHashData对一块数据进行哈希,把它加到指定的哈希对象中,再次用CryptGetHashParam设置一个哈希对象的参数,一个MD5运算的过程就完成了,呵呵简单吧!下面是我写的一个关于MD5的例子,请大家多多指教!