ファイルからバイナリ データを処理するプログラムがあります。
コードの概要は次のとおりです。
QFile fileIn ("the_file");
fileIn.open(QIODevice::ReadOnly);
このファイルには、バイナリ データとテキスト データが混在しています。ファイルの内容は QDataStream を使用して読み取られます。
QDataStream stream(&fileIn);
stream.setByteOrder(QDataStream::LittleEndian);
stream.setVersion(QDataStream::Qt_5_0);
QDataStream からのデータをさまざまなデータ型に読み取ることができます。例えば
QString the_value; // String
stream >> the_value;
qint32 the_num;
stream >> the_numm;
素敵で簡単。全体として、0x68 0x48 などの区切り記号を表す特定の値に到達するまで、ファイル データをバイト単位で読み取ります。この時点で、次のデータの種類 (floats、String、int など) を示す次の数バイトを取得し、必要に応じて抽出します。
したがって、データは次のように処理 (アウトライン) されます。
while ( ! stream.atEnd() )
{
qint8 byte1 = getInt8(stream);
qint8 byte2 = getInt8(stream);
if ( byte1 == 0x68 && byte2 == 0x48 )
{
qint8 byte3 = getInt8(stream);
qint8 byte4 = getInt8(stream);
if ( byte3 == 0x1 && byte4 == 0x7 )
{
do_this(stream);
}
else if ( byte3 == 0x2 && byte4 == 0x8 )
{
do_that(stream);
}
}
}
この埋め込みデータの一部は圧縮されている可能性があるため、
long dSize = 1024;
QByteArray dS = qUncompress( stream.device()->read(dSize));
QBuffer buffer;
buffer.setData(dS);
if (!buffer.open(QBuffer::ReadOnly)) {
qFatal("Buffer could not be opened. Something is very wrong!");
}
QDataStream stream2(&buffer);
stream2.setByteOrder(QDataStream::LittleEndian);
stream2.setVersion(QDataStream::Qt_5_0);
QDataStream の便利さにより、特定の型へのマッピングだけでなく、エンディアンの処理も簡単になるという点で、データの読み取りが容易になりますが、速度が犠牲になっているようです。この問題は、処理が再帰的であるという事実によって悪化します。読み取られるデータ自体に、同じ方法で読み取って処理する必要がある埋め込みファイル データが含まれる可能性があります。
より高速な代替手段はありますか?その場合、エンディアンを同じ方法で処理するにはどうすればよいですか?