我的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}
你会建议什么解决方案?
感谢您的帮助!
答案 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
会产生特定于实现的结果。我认为可以想象(尽管几乎没有)一种实现,其中char
比T
使用的某种类型具有更严格的对齐,而reinterpret_cast
会触发硬件异常。但是,我认为这种可能性相当学术化。
此外,这两个函数可能会受益于限制T
的编译时断言。通常,指针struct
包含指针和非POD类型不应与此一起使用。
答案 1 :(得分:4)
首先,永远不要发送int
和大于char
的其他类型 - 您将忽略字节顺序,收件人可能无法正确解释数据。
其次,您可以重载方法以接受内置类型,并使用内部htons()
等函数将数据以与机器无关的方式转换为网络层顺序。
如果您仍想使用vector
- 请使用以下内容:
vector<char> temp( sizeof( yourVariable ) );
memcpy( &temp[0], &yourVariable, sizeof( yourVariable ) );