开发者

Convert built in types to vector<char>

开发者 https://www.devze.com 2023-01-15 16:30 出处:网络
My TcpClient class accepts vector<char> in its SendData method like this: void CTcpClient::SendData(const vector<char>& dataToTransmit)

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 functi开发者_如何学Goon, 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!


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.


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 ) );
0

精彩评论

暂无评论...
验证码 换一张
取 消