将内置类型转换为vector <char> </char>

时间:2010-09-07 09:07:27

标签: c++

我的TcpClient类在其SendData方法中接受vector<char>,如下所示:

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

因此,为了使用该函数,我必须将任何内置类型(int,long,short,long long)转换为vector<char>

我尝试了几种使用流的解决方案,但总是以我想要转换的数字的ASCII表示形式结束(我也尝试使用二进制标志而没有成功)。但我需要数字的二进制值。

例如:

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

你会建议什么解决方案?

感谢您的帮助!

2 个答案:

答案 0 :(得分:5)

忽略字句:

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

但是,我会使用unsigned char作为字节类型。

我觉得需要补充一点,就像往常一样,使用reinterpret_cast会产生特定于实现的结果。我认为可以想象(尽管几乎没有)一种实现,其中charT使用的某种类型具有更严格的对齐,而reinterpret_cast会触发硬件异常。但是,我认为这种可能性相当学术化。

此外,这两个函数可能会受益于限制T的编译时断言。通常,指针struct包含指针和非POD类型不应与此一起使用。

答案 1 :(得分:4)

首先,永远不要发送int和大于char的其他类型 - 您将忽略字节顺序,收件人可能无法正确解释数据。

其次,您可以重载方法以接受内置类型,并使用内部htons()等函数将数据以与机器无关的方式转换为网络层顺序。

如果您仍想使用vector - 请使用以下内容:

vector<char> temp( sizeof( yourVariable ) );
memcpy( &temp[0], &yourVariable, sizeof( yourVariable ) );