我有一個程序,大致處理來自afile的二進制數據。調整QDataStream
代碼大綱如下:
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。在這一點上,接下來我將介紹接下來的幾個字節,告訴我接下來是什麼類型的數據(浮點數,字符串,整數等),並根據需要進行提取。
因此,數據orocessed(輪廓),如:
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的便利性使得它易於閱讀這些數據在映射到特定類型的同時也很容易處理永久性,但它似乎以犧牲速度爲代價。這些問題由於處理是遞歸的事實而變得複雜 - 讀取的數據本身可能包含嵌入式文件數據,這些數據需要以相同的方式讀取和處理。
是否有更快的選擇,如果以同樣的方式處理Endianess?
「但它似乎是在犧牲速度」。看起來有些功能是以犧牲速度爲代價的?這似乎是一個?調查哪些代碼對速度變慢負責可能有意義嗎?這導致避免過早的優化,這是不好的。你可以做一些分析? – AlexanderVX