在一般情况下,什么是在C ++中存储二进制数据的最佳方法是什么?选项,据我可以告诉,几乎归结为使用字符串或向量<字符>秒。 (我将省略字符* S和的malloc(可能性)■因为我特指C ++)。

通常我只是用一个字符串,但我不知道是否有STL内部确实可能惹二进制数据的理智费用我失踪,或转换。没有人对此有什么指针(HAR)?建议或偏好这种或那种方式?

有帮助吗?

解决方案

炭的载体是好的,因为该存储器是contiguious。因此,你可以有很多的C API的使用,如伯克利套接字或文件的API。你可以执行以下操作,例如:

  std::vector<char> vect;
  ...
  send(sock, &vect[0], vect.size());

和它将正常工作。

您基本上可以把它就像任何其他的动态分配的字符缓冲区。您可以扫描向上和向下寻找幻数或patters。您可以代替部分解析它。用于从插座接收可以很容易调整其大小追加更多的数据。

的缺点是在调整大小是不是非常有效的(调整大小或预先分配审慎)和删除从阵列的前部也将是非常ineficient。如果你需要,比方说,流行只是一个或一次过的数据结构前面的两个字符非常频繁,复制到一个deque这个处理之前可能是一种选择。这将花费你一份和deque内存不是连续的,所以你不能只是一个指针传递给一个C API。

底线,了解在潜水前的数据结构和它们的权衡,然而炭的载体通常是我在一般的做法看到使用。

其他提示

用的std :: string的最大问题是,目前的标准并不能保证它的底层存储是连续的。然而,没有已知的STL实现,其中字符串不是连续的,所以在实践中它可能不会失败。事实上,新的C ++ 0x标准是要解决此问题,通过强制要求的std :: string使用一个连续的缓冲液,如标准::矢量。

针对字符串另一种说法是,它的名称所暗示的,它包含一个字符串,而不是二进制缓冲区,这可能引起混乱那些谁读取代码。

这就是说,我建议向量以及

我用std::string这也和从未有过问题的。

一个“指针”,我昨天刚接收到的一个尖锐的提醒在一块代码:创建从二进制数据的一个块字符串时,使用std::string(startIter, endIter)构造形式,而不是std::string(ptr, offset, length)形式 - 后者使假设指针指向一个C风格串,并且第一零字符之后忽略任何东西(其拷贝“高达”指定length,不length字符)。

您当然应该使用焦炭的一些容器,但你要使用的容器取决于您的应用程序。

字符数有几个特性,使得其保持二进制数据有用:标准不允许为char数据类型,这是非常重要的任何“填充”,因为这意味着你不会在你的二进制布局得到垃圾。每个字符也被保证是正好一个字节,使得它的唯一的普通的旧的数据类型(POD)与设定宽度(所有其他被在上和/或下限的形式指定)。

上与其中存储字符适当STL容器的讨论通过远高于处理由Doug。哪一个你需要完全取决于你的使用情况。如果你只是抱着你通过遍历,没有任何特殊的查找数据块,追加/删除或拼接的需要,我宁愿载体,使你的意图不是的std :: string,其中有许多图书馆和功能,将承担更加清晰保持一个空终止c样式字符串。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top