我试图以下列方式创建二进制文件:
string buf;
...
buf += filename.length();
buf += filename;
等。所以首先我以二进制格式给出长度,但是如何将其转换为4字节字符数组,或2字节等?基本上我想实现与此相同的功能:
int len = filename.length();
fwrite(&len, sizeof(len), 1, fp);
哪种方法很好,但将其放在一个字符串中可能更容易处理。
编辑:我不想使用流,也不想使用矢量,我试图找出它是否可以用字符串。
答案 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
的值。该字符串将字节复制到其自身中,因此您将获得准确的数据。