[C++] Adding a string or char array to a byte vector
I'm currently working on a class to create and read out packets send through the network, so far I have it working with 16bit and 8bit integers (Well unsigned but still).

Now the problem is I've tried numerous ways of copying it over but somehow the _buffer got mangled, it segfaulted, or the result was wrong.

I'd appreciate if someone could show me a working example.

My current code can be seen below.

Thanks, Xeross

#Main

    #include <iostream>
    #include <stdio.h>
    #include "Packet.h"
    
    using namespace std;
    
    int main(int argc, char** argv)
    {
        cout << "#################################" << endl;
        cout << "#       Internal Use Only       #" << endl;
        cout << "#     Codename PACKETSTORM      #" << endl;
        cout << "#################################" << endl;
        cout << endl;
        
        Packet packet = Packet();
        packet.SetOpcode(0x1f4d);
        
        cout << "Current opcode is: " << packet.GetOpcode() << endl << endl;
        
        packet.add(uint8_t(5))
    		  .add(uint16_t(4000))
    		  .add(uint8_t(5));
    	
    	for(uint8_t i=0; i<10;i++)
    		printf("Byte %u = %x\n", i, packet._buffer[i]);
    		
    	printf("\nReading them out: \n1 = %u\n2 = %u\n3 = %u\n4 = %s",
    		packet.readUint8(),
    		packet.readUint16(),
    		packet.readUint8());
        
        return 0;
    }

#Packet.h

    #ifndef _PACKET_H_
    #define _PACKET_H_
    
    #include <iostream>
    #include <vector>
    
    #include <stdio.h>
    #include <stdint.h>
    #include <string.h>
    
    using namespace std;
    
    class Packet
    {
        public:
            Packet() : m_opcode(0), _buffer(0), _wpos(0), _rpos(0) {}
            Packet(uint16_t opcode) : m_opcode(opcode), _buffer(0), _wpos(0), _rpos(0) {}
        
            uint16_t GetOpcode() { return m_opcode; }
            void SetOpcode(uint16_t opcode) { m_opcode = opcode; }
            
    		Packet& add(uint8_t value)
    		{
    			if(_buffer.size() < _wpos + 1)
    				_buffer.resize(_wpos + 1);
    			
    			memcpy(&_buffer[_wpos], &value, 1);
    			_wpos += 1;
    				
    			return *this;
    		}
    		Packet& add(uint16_t value)
    		{
    			if(_buffer.size() < _wpos + 2)
    				_buffer.resize(_wpos + 2);
    			
    			memcpy(&_buffer[_wpos], &value, 2);
    			_wpos += 2;
    				
    			return *this;
    		}
    		
    		uint8_t readUint8()
    		{
    			uint8_t result = _buffer[_rpos];
    			_rpos += sizeof(uint8_t);
    			return result;
    		}
    		uint16_t readUint16()
    		{
    			uint16_t result;
    			memcpy(&result, &_buffer[_rpos], sizeof(uint16_t));
    			
    			_rpos += sizeof(uint16_t);
    			return result;
    			
    		}
    
    		uint16_t m_opcode;
            std::vector<uint8_t> _buffer;
        protected:
    
            size_t _wpos; // Write position
            size_t _rpos; // Read position
    };
    
    #endif // _PACKET_H_


[C++] Adding a string or char array to a byte vector
===

I'm currently working on a class to create and read out packets send through the network, so far I have it working with 16bit and 8bit integers (Well unsigned but still).

Now the problem is I've tried numerous ways of copying it over but somehow the _buffer got mangled, it segfaulted, or the result was wrong.

I'd appreciate if someone could show me a working example.

My current code can be seen below.

Thanks, Xeross

#Main

    #include <iostream>
    #include <stdio.h>
    #include "Packet.h"
    
    using namespace std;
    
    int main(int argc, char** argv)
    {
        cout << "#################################" << endl;
        cout << "#       Internal Use Only       #" << endl;
        cout << "#     Codename PACKETSTORM      #" << endl;
        cout << "#################################" << endl;
        cout << endl;
        
        Packet packet = Packet();
        packet.SetOpcode(0x1f4d);
        
        cout << "Current opcode is: " << packet.GetOpcode() << endl << endl;
        
        packet.add(uint8_t(5))
    		  .add(uint16_t(4000))
    		  .add(uint8_t(5));
    	
    	for(uint8_t i=0; i<10;i++)
    		printf("Byte %u = %x\n", i, packet._buffer[i]);
    		
    	printf("\nReading them out: \n1 = %u\n2 = %u\n3 = %u\n4 = %s",
    		packet.readUint8(),
    		packet.readUint16(),
    		packet.readUint8());
        
        return 0;
    }

#Packet.h

    #ifndef _PACKET_H_
    #define _PACKET_H_
    
    #include <iostream>
    #include <vector>
    
    #include <stdio.h>
    #include <stdint.h>
    #include <string.h>
    
    using namespace std;
    
    class Packet
    {
        public:
            Packet() : m_opcode(0), _buffer(0), _wpos(0), _rpos(0) {}
            Packet(uint16_t opcode) : m_opcode(opcode), _buffer(0), _wpos(0), _rpos(0) {}
        
            uint16_t GetOpcode() { return m_opcode; }
            void SetOpcode(uint16_t opcode) { m_opcode = opcode; }
            
    		Packet& add(uint8_t value)
    		{
    			if(_buffer.size() < _wpos + 1)
    				_buffer.resize(_wpos + 1);
    			
    			memcpy(&_buffer[_wpos], &value, 1);
    			_wpos += 1;
    				
    			return *this;
    		}
    		Packet& add(uint16_t value)
    		{
    			if(_buffer.size() < _wpos + 2)
    				_buffer.resize(_wpos + 2);
    			
    			memcpy(&_buffer[_wpos], &value, 2);
    			_wpos += 2;
    				
    			return *this;
    		}
    		
    		uint8_t readUint8()
    		{
    			uint8_t result = _buffer[_rpos];
    			_rpos += sizeof(uint8_t);
    			return result;
    		}
    		uint16_t readUint16()
    		{
    			uint16_t result;
    			memcpy(&result, &_buffer[_rpos], sizeof(uint16_t));
    			
    			_rpos += sizeof(uint16_t);
    			return result;
    			
    		}
    
    		uint16_t m_opcode;
            std::vector<uint8_t> _buffer;
        protected:
    
            size_t _wpos; // Write position
            size_t _rpos; // Read position
    };
    
    #endif // _PACKET_H_

