【问题标题】:How to push binary data into std::string?如何将二进制数据推送到 std::string?
【发布时间】:2011-08-15 12:20:36
【问题描述】:

我正在尝试通过以下方式创建二进制文件:

string buf;
...
buf += filename.length();
buf += filename;

等等。所以首先我以二进制格式给出长度,但我如何将其转换为 4 字节字符数组或 2 字节等?基本上我想实现与此相同的功能:

int len = filename.length();
fwrite(&len, sizeof(len), 1, fp);

这很好用,但将它放在一个字符串中可能更容易处理。

编辑:我不想使用流,也不想使用向量,我试图找出字符串是否可能。

【问题讨论】:

    标签: c++ string visual-studio-2008 binaryfiles binary-data


    【解决方案1】:

    流是要走的路。不是strings

    【讨论】:

    • 字符串流呢? :-)
    • @daniel,所以这不可能用字符串?
    • 它不是首选。您使用的是二进制数据,而不是人类可读的字符串。
    • 这是课程的马。你不会骑着夏尔马跑全国大赛,也不会用纯种马耕地。
    • @graham.reeds,呃,我的意思是,如果我因为别人说这不是最好的事情而不允许我学习,那么我将只是一只跟随别人的盲羊。 . 为什么我想学这个,是因为我只是想要。我不在乎它会有多大用处,但它肯定会教给我一些我还不知道的关于 c++ 的新知识。
    【解决方案2】:

    使用向量来保存数据,或将其直接写入文件(通过流)

    【讨论】:

      【解决方案3】:

      只需使用 std:vector<unsigned char> 并使用 istream 或 ostream 迭代器从向量读取/写入数据。例如从文件中读取你可以这样做:

      vector<unsigned char> binary_buffer;
      
      ifstream in_file("my_binary_file.bin", ios_base::binary | ios_base::in);
      istream_iterator<unsigned char> end_of_file;
      istream_iterator<unsigned char> in_file_iter(in_file);
      
      while (in_file_iter != end_of_file)
      {
          binary_buffer.push_back(*in_file_iter++);
      }
      

      输出会更简单:

      ofstream out_file("another_binary_file.bin", ios_base::binary | ios_base::out);
      ostream_iterator<unsigned char> binary_output(out_file);
      copy(binary_buffer.begin(), binary_buffer.end(), binary_output);
      

      【讨论】:

      • std::string 是二进制保存,可以作为字节数组使用。
      • @Ludger: 使用 std::string 暗示(至少乍一看)您希望将此类数据视为文本字符串,而使用 std::vector&lt;unsigned char&gt; 很明显它只是一个二进制 blob .
      • @matteo,只是想知道,如果字符串永远不应该这样使用,为什么它还允许二进制数据?
      • “允许二进制数据”只是文本字符串只是一种特定类型的二进制数据这一事实的结果。 std::stringstd::vector&lt;unsigned char&gt; 之间的区别实际上并不在于数据的存储方式(两者都可以将任何字符存储在连续数组中),而在于它将如何使用,因此也在于它们提供的方法(@ 987654328@ 有在字符串上常用的方法,与 C 字符串的转换,...​​)。
      【解决方案4】:

      是的,可以这样做,因为这是 C++,在 C++ 中一切皆有可能。

      首先,这是你的做法,然后我会回答为什么可能需要这样做的问题:

      std::ifstream input( "my.png", std::ios::binary );
      std::vector<unsigned char> buffer(std::istreambuf_iterator<char>(input), {});
      int buffSize = buffer.size();
      std::string myString(buffer.begin(), buffer.end());
      

      在我的例子中,我使用了一个框架,其中 HTTP 客户端只支持发布消息正文的字符串,但我需要将文件的原始二进制文件发布到我正在使用的服务。我可能会弄乱库的内部(不好),或者为简单的文件发布引入另一个不必要的依赖项(也不太好)。

      但是由于字符串可以保存这些数据,所以我能够读取文件,将其复制到字符串然后上传。

      无论哪种方式,这都是一种不幸的情况,但在某些情况下,能够做到这一点是有帮助的。通常你会想做一些不同的事情。这对于其他人来说不是最清楚的,并且您会从副本中受到一些性能损失,但它有效;它有助于理解其工作原理的内部原理。 std::string 在内部以二进制格式连续保存数据,就像向量一样,并且可以从向量中的迭代器初始化。

      unsigned char 是一个字节长,所以它就像一个 byte 值。字符串将字节复制到自身中,因此您最终得到了准确的数据。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-18
        • 2013-10-01
        • 2013-12-29
        • 2023-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多