Ответ 1
Я предполагаю, что ваши входные данные являются двоичными (а не текстовыми) и что вы хотите извлечь из него куски двоичных данных. Все без копирования ваших входных данных.
Вы можете комбинировать boost::iostreams::basic_array_source
и boost::iostreams::stream_buffer
(от Boost.Iostreams) с помощью boost::archive::binary_iarchive
(от Boost.Serialization), чтобы иметь возможность использовать удобные операции извлечения → для чтения фрагментов двоичных данных.
#include <stdint.h>
#include <iostream>
#include <boost/iostreams/device/array.hpp>
#include <boost/iostreams/stream.hpp>
#include <boost/archive/binary_iarchive.hpp>
int main()
{
uint16_t data[] = {1234, 5678};
char* dataPtr = (char*)&data;
typedef boost::iostreams::basic_array_source<char> Device;
boost::iostreams::stream_buffer<Device> buffer(dataPtr, sizeof(data));
boost::archive::binary_iarchive archive(buffer, boost::archive::no_header);
uint16_t word1, word2;
archive >> word1 >> word2;
std::cout << word1 << "," << word2 << std::endl;
return 0;
}
С GCC 4.4.1 на AMD64 он выдает:
1234,5678
Boost.Serialization очень эффективен и знает, как сериализовать все основные типы, строки и даже контейнеры STL. Вы можете легко сделать ваши типы сериализуемыми. См. Документацию. Скрытый где-то в источниках Boost.Serialization является примером портативного двоичного архива, который знает, как выполнить правильную свопинг для вашей машинной сущности. Это может быть полезно и вам.
Если вам не нужна привязанность Boost.Serialization и с удовольствием читаем двоичные данные в стиле fread(), вы можете использовать basic_array_source
более простым способом:
#include <stdint.h>
#include <iostream>
#include <boost/iostreams/device/array.hpp>
#include <boost/iostreams/stream.hpp>
int main()
{
uint16_t data[] = {1234, 5678};
char* dataPtr = (char*)&data;
typedef boost::iostreams::basic_array_source<char> Device;
boost::iostreams::stream<Device> stream(dataPtr, sizeof(data));
uint16_t word1, word2;
stream.read((char*)&word1, sizeof(word1));
stream.read((char*)&word2, sizeof(word2));
std::cout << word1 << "," << word2 << std::endl;
return 0;
}
Я получаю тот же результат с этой программой.