Я предполагаю, что ваши входные данные являются двоичными (не текстовыми), и вы хотите извлечь из них куски двоичных данных. Все без копирования ваших входных данных.
Вы можете объединить 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;
}
Я получаю такой же вывод с этой программой.