Я предполагаю, что ваш ввод данных в двоичном (не текст), и что вы хотите, чтобы извлечь куски двоичных данных из него. Все без копирования ваших входных данных.
Вы можете комбинировать 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;
}
I получить тот же результат с этой программой.
Какая версия MSVC? > 6, надеюсь. ;) –
MSVC 9.0 aka 2008 –
Я думаю, что ваше решение хорошее. :) http://stackoverflow.com/questions/1448467/initializing-ac-stdistringstream-from-an-in-memory-buffer/1449527#1449527 –