Как вставить двоичные данные в std :: string? - PullRequest
2 голосов
/ 15 августа 2011

Я пытаюсь создать двоичный файл следующим образом:

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

и т.д.. Итак, сначала я даю длину в двоичном формате, но как мне преобразовать это в 4-байтовый массив символов или 2-байтовый и т. Д.? в основном я хочу добиться такой же функциональности, как это было бы:

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

Что отлично работает, но проще обрабатывать его в одной строке.

Редактировать: Я не хочу использовать ни потоки, ни вектор, я пытаюсь выяснить, возможно ли это со строками.

Ответы [ 4 ]

4 голосов
/ 15 августа 2011

Потоки - это путь. Не strings.

2 голосов
/ 15 августа 2011

просто используйте 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);
2 голосов
/ 15 августа 2011

Используйте вектор для хранения данных или запишите его прямо в файл (через потоки)

0 голосов
/ 08 мая 2019

Да, это возможно, потому что это 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.Строка копирует байты в себя, поэтому вы получите точные данные.

...