Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Convert built in types to vector<char>

Tags:

c++

My TcpClient class accepts vector<char> in its SendData method like this:

void CTcpClient::SendData(const vector<char>& dataToTransmit)

Therefore, in order to use the function, I have to convert any built in type (int, long, short, long long) to a vector<char>.

I tried several solutions using streams but always end up with an ASCII representation of the number I want to convert (I also tried to use binary flags without success). But I need the binary values of the numbers.

For example:

int num = 0x01234567
vector<char> whatIWant = {0x01, 0x23, 0x45, 0x67}

What solution would you suggest?

Thanks for any help!

like image 955
nabulke Avatar asked Apr 10 '26 12:04

nabulke


2 Answers

Ignoring endianess:

template< typename T >
char* begin_binary(const T& obj) {return reinterpret_cast<char*>(&obj);}
template< typename T >
char* end_binary  (const T& obj) {return begin_binary(obj)+sizeof(obj);}

int num = 0x01234567;
vector<char> whatIWant( begin_binary(num), end_binary(num) );

However, I would use unsigned char as a byte type.

I feel the need to add to this that, as always, the use of reinterpret_cast makes the result of this implementation-specific. I think one could imagine (though barely) an implementation where char has stricter alignment than some type used for T and that reinterpret_cast would trigger a hardware exception. However, I consider this possibility rather academic.

Further, the two functions would probably benefit from a compile-time assertion restricting T. Commonly, pointers, struct's containing pointers, and non-POD types shouldn't be used with this.

like image 167
sbi Avatar answered Apr 12 '26 13:04

sbi


First of all, never send ints and other types larger than char like that - you will ignore endianness and the recipient might be unable to interpret the data properly.

Second, you can overload the method to accept built-in types and use functions like htons() inside for converting the data to network layer order in machine-independent fashion.

If you still want to use vector - use something like this:

vector<char> temp( sizeof( yourVariable ) );
memcpy( &temp[0], &yourVariable, sizeof( yourVariable ) );
like image 27
sharptooth Avatar answered Apr 12 '26 11:04

sharptooth



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!