当前位置:  开发笔记 > 编程语言 > 正文

使用C++/STL存储二进制数据的"正确"方法

如何解决《使用C++/STL存储二进制数据的"正确"方法》经验,为你挑选了3个好方法。

一般来说,在C++中存储二进制数据的最佳方法是什么?据我所知,这些选项很大程度上归结为使用字符串或向量 s.(我将省略char*s和malloc()的可能性,因为我特指C++).

通常我只是使用一个字符串,但是我不确定是否存在我缺少的开销,或者STL在内部进行的转换可能会破坏二进制数据的完整性.有没有人对此有任何指针(har)?这样或那样的建议或偏好?



1> Doug T...:

char的向量很好,因为内存是连续的.因此,您可以将它与许多C API一起使用,例如berkley套接字或文件API.您可以执行以下操作,例如:

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

它会工作正常.

您可以像处理任何其他动态分配的char缓冲区一样处理它.您可以上下扫描寻找神奇的数字或图案.您可以部分解析它.要从套接字接收,您可以非常轻松地调整它以附加更多数据.

缺点是调整大小并不是非常有效(谨慎调整大小或预先分配),并且从数组前面删除也将非常缺乏.例如,如果您需要经常在数据结构前面一次只弹出一个或两个字符,则可以选择在此处理之前复制到双端队列.这会使您复制并且双端队列内存不是连续的,因此您不能只是将指针传递给C API.

最重要的是,在潜入之前了解数据结构及其权衡,但是char的向量通常是我在一般实践中使用的.


好答案.对于学习部分:我发现了很好的图片,显示了前一段时间使用容器,并将其嵌入到这个答案中:http://stackoverflow.com/questions/366432/extending-stdlist#366710

2> 小智..:

std :: string的最大问题是当前标准不保证其底层存储是连续的.但是,没有已知的STL实现,其中string不是连续的,因此在实践中它可能不会失败.事实上,新的C++ 0x标准将通过强制std :: string使用连续缓冲区(例如std :: vector)来解决此问题.

另一个反对字符串的参数是它的名字表明它包含一个字符串,而不是一个二进制缓冲区,这可能会引起混淆读取代码的人.

也就是说,我也建议使用矢量.



3> Head Geek..:

std::string也是这样用的,从来没有遇到过问题.

一个"指针",我刚刚在昨天的一段代码中收到了一个尖锐的提醒:当从二进制数据块创建一个字符串时,使用std::string(startIter, endIter)构造函数形式,而不是std::string(ptr, offset, length)形式 - 后者假设指针指向到C风格的字符串,并在第一个零字符后忽略任何内容(它复制"最多"指定的字符串,而length不是length字符).

推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有