728x90
데이터를 주고 받을 때 암호화/복호화에 용의한 BYTE 형의 Stream 제어 클레스를 만들어 보았습니다
std::copy() 가 주석이고 stdext::unchecked_copy() 를 쓰는 것을 볼 수 있는데 copy() 로 쓰면 위험성이 있습니다
그래서 권장이 unchecked_copy() 인데 stdext:: 로 된 것을 잘 보세요! 아마도 vs2008 부터 지원할수도 있습니다
이전 버전에서는 그냥 copy 로 쓰시면 됩니다
사실은 보내는 부분 보다는 받는 부분이 더 걸작인데 ㅎㅎ
class 예제
class CByteStream
{
BYTE* m_pData;
int m_nSize;
public:
BYTE* GetData() { return m_pData; }
int size() { return m_nSize; }
template<class T> void AddValue(T t)
{
int nLoc = m_nSize;
int newSize = 0;
if(m_pData == NULL)
{
newSize = sizeof(T);
m_pData = new BYTE[newSize];
std::cout << "Send Data ";
}
else
{
newSize = m_nSize + sizeof(T);
std::auto_ptr Temp(new BYTE[newSize]);
// std::copy(m_pData, m_pData+nLoc, Temp.get());
stdext::unchecked_copy(m_pData, m_pData+nLoc, Temp.get());
delete m_pData;
m_pData = NULL;
m_pData = new BYTE[newSize];
// std::copy(Temp.get(), Temp.get()+newSize, m_pData);
stdext::unchecked_copy(Temp.get(), Temp.get()+newSize, m_pData);
}
*(T*)(m_pData + nLoc) = (t);
std::cout << t << ", ";
m_nSize = newSize;
}
void AddString(std::string s)
{
AddValue(s.size());
int nLoc = m_nSize;
int newSize = m_nSize + s.size();
std::auto_ptr Temp(new BYTE[newSize]);
// std::copy(m_pData, m_pData+nLoc, Temp.get());
stdext::unchecked_copy(m_pData, m_pData+nLoc, Temp.get());
delete m_pData;
m_pData = NULL;
m_pData = new BYTE[newSize];
// std::copy(Temp.get(), Temp.get()+newSize, m_pData);
stdext::unchecked_copy(Temp.get(), Temp.get()+newSize, m_pData);
// std::copy(s.begin(), s.end(), m_pData + nLoc);
stdext::unchecked_copy(s.begin(), s.end(), m_pData + nLoc);
std::cout << s.c_str() << ", ";
m_nSize = newSize;
}
CByteStream()
{
m_pData = NULL;
m_nSize = 0;
}
};
실 사용 예제.
이대로 해서 스마트 포인터에 넣어 전송해버리고 자동삭제-
void Send()
{
CByteStream Msg;
Msg.AddValue(1234);
Msg.AddValue(3.14f);
Msg.AddValue(true);
Msg.AddString("나는 꼼수다");
Msg.AddString("Test : iPhone4");
std::cout << std::endl;
std::auto_ptr ptr(Msg.GetData());
boost::asio::mutable_buffer buf = boost::asio::buffer(ptr.get(), _BUFF_SIZE);
boost::system::error_code error;
int len = boost::asio::write(m_Socket, boost::asio::buffer(buf, Msg.size()), error);
}
728x90
'프로그래밍 > STL' 카테고리의 다른 글
| STL map / multimap (0) | 2011.11.03 |
|---|---|
| STL vector, list, map 반복자 도중 삭제 (0) | 2011.11.02 |
댓글