入力データが(テキストではなく)バイナリであり、そこからバイナリデータのチャンクを抽出したいとします。入力データのコピーを作成せずにすべて。
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上のGCC4.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;
}
このプログラムでも同じ出力が得られます。