Merge pull request #289 from timonwong/mdict

MDict: Fix checksum calculating for plain data block
This commit is contained in:
Tvangeste 2013-05-01 02:38:06 -07:00
commit ef32518b95
3 changed files with 13 additions and 5 deletions

View file

@ -61,7 +61,8 @@ bool isNameOfSound( string const & name )
endsWith( s, ".mpc" ) ||
endsWith( s, ".wma" ) ||
endsWith( s, ".wv" ) ||
endsWith( s, ".ape" );
endsWith( s, ".ape" ) ||
endsWith( s, ".spx" );
}
bool isNameOfPicture( string const & name )

View file

@ -247,13 +247,20 @@ bool MdictParser::parseCompressedBlock( size_t compressedBlockSize, const char *
quint32 type;
quint32 checksum;
type = qFromBigEndian<quint32>( ( const uchar * ) compressedBlockPtr );
checksum = qFromBigEndian<quint32>( ( const uchar * )compressedBlockPtr + sizeof( type ) );
checksum = qFromBigEndian<quint32>( ( const uchar * )compressedBlockPtr + sizeof( quint32 ) );
if ( type == 0x00000000 )
{
// No compression
checksum >>= 8;
if ( checksum != qFromBigEndian<quint16>( dataSize - 2 ) )
checksum &= 0xffff;
quint16 sum = 0;
for ( size_t i = 0; i < dataSize; i++ )
{
sum += dataPtr[i];
}
sum += 1;
if ( checksum != sum )
{
qWarning() << "MDict: parseCompressedBlock: plain: checksum not match";
return false;

View file

@ -66,7 +66,7 @@ public:
enum
{
kParserVersion = 0x000000b
kParserVersion = 0x000000c
};
struct RecordIndex