如何将二进制数据推送到std :: string?

时间:2011-08-15 12:20:36

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

我试图以下列方式创建二进制文件:

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

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

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

哪种方法很好,但将其放在一个字符串中可能更容易处理。

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

4 个答案:

答案 0 :(得分:4)

Streams是要走的路。不是strings

答案 1 :(得分:2)

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

答案 2 :(得分:2)

只需使用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);

答案 3 :(得分:0)

是的,可以这样做,因为这是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与vector一样,以二进制格式在内部连续保存数据,并且可以从vector中的迭代器进行初始化。

unsigned char的长度为1个字节,因此它类似于byte的值。该字符串将字节复制到其自身中,因此您将获得准确的数据。