Используя C ++ и Qt, мне нужно сохранить некоторые необработанные байтовые данные (массив без знака) в QDomElement (узел XML), а затем восстановить его позже, чтобы я мог сравнить его с записанными необработанными данными непосредственно в другой двоичный файл. Во время тестирования я заметил, что мое решение работает ~ 85% времени, но сравнение восстановленных данных и необработанных данных, считываемых из файла, иногда дает сбой. Приведенные ниже фрагменты кода иллюстрируют методы Qt, которые я сейчас использую. У меня очень мало знаний о различных кодировках символов и о том, что мне нужно искать в этом отношении, поэтому я предполагаю, что моя ошибка как-то связана с этим.
Хранение необработанных данных в XML:
QDomElement myElement;
unsigned char rawData[ DATA_LEN ];
foo( rawData ); // upon return, rawData now contains the data I want to store in XML
QByteArray dataByteArray( reinterpret_cast< char * >( rawData ) );
QString dataStr( dataByteArray.toBase64() );
QByteArray excluded = " /():|+,.=[]_^{}";
myElement.setAttribute( "Data", QUrl::toPercentEncoding( dataStr, excluded ) );
Восстановление данных из XML и сравнение с необработанными данными, считанными из двоичного файла (иногда происходит сбой memcmp ()):
unsigned char recoveredData[ DATA_LEN ];
QString dataStr = QUrl::fromPercentEncoding( stringFromXmlNode.toUtf8() );
QByteArray dataByteArray = QByteArray::fromBase64( dataStr.toAscii() );
memcpy( recoveredData, reinterpret_cast< unsigned char * >( dataByteArray.data() ), DATA_LEN );
unsigned char dataFromFile[ DATA_LEN ];
fread( dataFromFile, 1, DATA_LEN, filePtr );
if( 0 != memcmp( dataFromFile, recoveredData, DATA_LEN ) )
{
return false;
}
Я ограничен Qt 4.8, поэтому пожалуйста, воздержитесь от любых решений Qt5-speci c, если возможно, спасибо!