#ifndef MSTREAM_HPP_ #define MSTREAM_HPP_ #include #include namespace tls { //------------------------------------------------------------------------------ //To avoid writing the cursor position in the array at each step class MStream { private: char* m_data; unsigned short m_pos; bool m_owner; public: MStream(){ m_data=NULL; m_pos=0; m_owner=false;}; MStream(char* data, unsigned short pos, bool owner){ m_data=data; m_pos=pos; m_owner=owner; }; MStream(unsigned char* data, unsigned short pos, bool owner){ m_data=(char*)data; m_pos=pos; m_owner=owner; }; ~MStream(){ if(m_owner) delete m_data; }; unsigned short getPos(){ return m_pos; }; void setPos(unsigned short pos){ m_pos = pos; }; char* getData(){ return m_data; }; void setData(char* data){ m_data = data; }; void setOwner(bool val){m_owner=val;}; bool getOwner(bool val){ return m_owner;}; bool write(char val){ *((char*)&m_data[m_pos]) = val; m_pos+=1; return true; }; bool write(signed char val){ *((signed char*)&m_data[m_pos]) = val; m_pos+=1; return true; }; bool write(unsigned char val){ *((unsigned char*)&m_data[m_pos]) = val; m_pos+=1; return true; }; bool write(signed short int val){ *((signed short int*)&m_data[m_pos]) = val; m_pos+=2; return true; }; bool write(unsigned short val){ *((unsigned short*)&m_data[m_pos]) = val; m_pos+=2; return true; }; bool write(signed int val){ *((signed int*)&m_data[m_pos]) = val; m_pos+=4; return true; }; bool write(unsigned int val){ *((unsigned int*)&m_data[m_pos]) = val; m_pos+=4; return true; }; //Не С++ стиль а "big endian" bool writeR(char val){ *((char*)&m_data[m_pos]) = val; m_pos+=1; return true; }; bool writeR(signed char val){ *((signed char*)&m_data[m_pos]) = val; m_pos+=1; return true; }; bool writeR(unsigned char val){ *((unsigned char*)&m_data[m_pos]) = val; m_pos+=1; return true; }; bool writeR(signed short int val){ m_data[m_pos] = ((char*)&val)[0]; m_data[m_pos+1] = ((char*)&val)[1]; m_pos+=2; return true; }; bool writeR(unsigned short val){ m_data[m_pos] = ((char*)&val)[1]; m_data[m_pos+1] = ((char*)&val)[0]; m_pos+=2; return true; }; bool writeR(signed int val) { m_data[m_pos] = ((char*)&val)[3]; m_pos++; m_data[m_pos] = ((char*)&val)[2]; m_pos++; m_data[m_pos] = ((char*)&val)[1]; m_pos++; m_data[m_pos] = ((char*)&val)[0]; m_pos++; return true; }; bool writeR(unsigned int val) { m_data[m_pos] = ((char*)&val)[3]; m_pos++; m_data[m_pos] = ((char*)&val)[2]; m_pos++; m_data[m_pos] = ((char*)&val)[1]; m_pos++; m_data[m_pos] = ((char*)&val)[0]; m_pos++; return true; }; bool write(char* val, int len){ for(int i=0;i=65535) return false; unsigned short size=str.length(); m_data[m_pos] = ((uint8_t*)&size)[1]; m_pos++; m_data[m_pos] = ((uint8_t*)&size)[0]; m_pos++; write(str.c_str(),str.length()); return true; }//Для MQTT протокола (2 первых байта длина строки) std::string readStr2r() //Первых 2 байта под длину (Для MQTT протокола) { std::string result; unsigned short len; ((uint8_t*)&len)[1] = m_data[m_pos]; m_pos++; ((uint8_t*)&len)[0] = m_data[m_pos]; m_pos++; result.append((char *)&m_data[m_pos], len); m_pos+=len; return result; } unsigned char readUInt1() { unsigned char result=m_data[m_pos]; m_pos++; return result; }; char readInt1(){ char result=m_data[m_pos]; m_pos+=1; return result; }; unsigned short readUInt2() { unsigned short result=*((unsigned short*)&m_data[m_pos]); m_pos+=2; return result; }; short readInt2() { short result=*((short*)&m_data[m_pos]); m_pos+=2; return result; }; short readInt2R() //Байты в обратном порядке { short result; result = *((unsigned char*)&m_data[m_pos]); result = result << 8; result = result | *((unsigned char*)&m_data[m_pos+1]); m_pos+=2; return result; }; unsigned short readUInt2R() //Байты в обратном порядке (big endian) { unsigned short result; result = *((unsigned char*)&m_data[m_pos]); result = result << 8; result = result | *((unsigned char*)&m_data[m_pos+1]); m_pos+=2; return result; }; unsigned int readUInt3() //Читаем 3 байта { unsigned int result = 0; ((unsigned char*)&result)[0] = m_data[m_pos]; ((unsigned char*)&result)[1] = m_data[m_pos+1]; ((unsigned char*)&result)[2] = m_data[m_pos+2]; m_pos+=3; return result; } unsigned int readUInt3R() //Читаем 3 байта { unsigned int result = 0; ((unsigned char*)&result)[0] = m_data[m_pos+2]; ((unsigned char*)&result)[1] = m_data[m_pos+1]; ((unsigned char*)&result)[2] = m_data[m_pos]; m_pos+=3; return result; } unsigned int readUInt4() { unsigned int result=*((unsigned int*)&m_data[m_pos]); m_pos+=4; return result; }; unsigned int readUInt4R() // Байты в обратном порядке { unsigned int result; result = *((unsigned char*)&m_data[m_pos]); result = result << 8; result = result | *((unsigned char*)&m_data[m_pos+1]); result = result << 8; result = result | *((unsigned char*)&m_data[m_pos+2]); result = result << 8; result = result | *((unsigned char*)&m_data[m_pos+3]); m_pos+=4; return result; }; int readInt4() { int result=*((int*)&m_data[m_pos]); m_pos+=4; return result; }; unsigned long long readUInt7() { char buf[8]={0,0,0,0,0,0,0,0}; for(int ch=0;ch<7;ch++) buf[ch]=m_data[m_pos+ch]; unsigned long long result=*((unsigned long long*)buf); m_pos+=7; return result; }; unsigned long long readUInt7R() //014135835392AB = 353173069075115 { char buf[8]={0,0,0,0,0,0,0,0}; for(int ch=0;ch<7;ch++) { buf[ch]=m_data[m_pos+6-ch]; } unsigned long long result=*((unsigned long long*)buf); m_pos+=7; return result; }; unsigned long long readUInt8() { unsigned long long result=*((unsigned long long*)&m_data[m_pos]); m_pos+=8; return result; }; unsigned long long readUInt8R() { unsigned long long result; result = *((unsigned char*)&m_data[m_pos]); result = result << 8; result = result | *((unsigned char*)&m_data[m_pos+1]); result = result << 8; result = result | *((unsigned char*)&m_data[m_pos+2]); result = result << 8; result = result | *((unsigned char*)&m_data[m_pos+3]); result = result << 8; result = result | *((unsigned char*)&m_data[m_pos+4]); result = result << 8; result = result | *((unsigned char*)&m_data[m_pos+5]); result = result << 8; result = result | *((unsigned char*)&m_data[m_pos+6]); result = result << 8; result = result | *((unsigned char*)&m_data[m_pos+7]); m_pos+=8; return result; }; bool Read(void* val, int len) { for(int i=0;i0) { result.assign(&m_data[m_pos], len); m_pos+=len; } return result; } }; } #endif //MSTREAM_HPP_