【问题标题】:Convert built in types to vector<char>将内置类型转换为 vector<char>
【发布时间】:2010-09-08 05:36:37
【问题描述】:

我的 TcpClient 类在其 SendData 方法中接受 vector&lt;char&gt;,如下所示:

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

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

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

例如:

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

你会建议什么解决方案?

感谢您的帮助!

【问题讨论】:

  • 为什么不重载SendData() 来接受内置类型?您还可以重载SendData() 以接受“first”和“last”迭代器,以便用户可以使用其他容器。
  • @In silico:我知道我可以重载 SendData() 以接受内置类型。但我想知道的是如何实际转换它们。

标签: c++


【解决方案1】:

忽略字节序:

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 类型不应与此一起使用。

【讨论】:

  • 那是中性的。它肯定会起作用,而且它是“迭代器方式”,它只写一次向量元素(而在我的回答中它们写了两次),但这让我再次想知道迭代器是否有什么不能做的。
  • @sharptooth:这不是为了迭代器,而是为了std::vector。唯一接受现有数据的std::vector ctor 需要迭代器,为了使用它,您需要传递迭代器。
  • 是的,我理解这背后的意图。将数据写入缓冲区而不先将缓冲区清零显然更好。
【解决方案2】:

首先,永远不要像这样发送ints 和其他大于char 的类型 - 你会忽略字节序,接收者可能无法正确解释数据。

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

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

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

【讨论】:

  • 我在示例中省略了处理字节序问题的函数。在内部,所有多字节类型都正确转换为网络字节顺序。
  • @nabulke:好的,那么你开始了。
猜你喜欢
  • 2014-05-16
  • 1970-01-01
  • 1970-01-01
  • 2012-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-19
相关资源
最近更新 更多