我假设你的输入数据是二进制(不是文本),并且你想从中提取二进制数据块。所有这些都不需要复制输入数据。
您可以结合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;
}
随着AMD64 GCC 4.4.1,它输出:
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;
}
我用这个程序得到相同的输出。
什么版本的MSVC? > 6,我希望。 ;) – 2010-01-17 06:15:24
MSVC 9.0又名2008 – 2010-01-17 06:21:16
我认为你的解决方案很好。 :) http://stackoverflow.com/questions/1448467/initializing-ac-stdistringstream-from-an-in-memory-buffer/1449527#1449527 – 2010-01-17 10:55:28