[Qt C++]对酷狗krc文件进行解码

        按照http://www.52pojie.cn/thread-286822-1-1.html 的方法,用楼主提供的E语言代码,改写了一个C++的。程序用到了Zlib库进行解码,请参看我上一篇文章。(http://blog.csdn.net/sunnysab/article/details/46672949)。 解码的方法很简单,所以代码也不长。首先读入文本,然后与Keys进行异或操作,再使用Zlib库进行解压缩。解压缩后的数据如图:[Qt C++]对酷狗krc文件进行解码_第1张图片

         只是不知道每个字之前的标签代表的是什么意思。代码如下:

#include 
#include 
#include 
#include "zlib.h"


const int   Keys[] =  {64, 71, 97, 119, 94, 50, 116, 71, 81, 54, 49, 45, 206, 210,

                 110, 105};

typedef int  CONVERT_CODE;

#define   CONVERT_SUCCESS       0x00
#define   CONVERT_FILE_EMPTY    0x01
#define   CONVERT_PARA_ERR      0x02
#define   CONVERT_FORMAT_ERR    0x03
#define   CONVERT_UNKNOWN       0x04

/*
 * 函  数: KrcDecode
 * 功  能: 对KRC文件进行解码
 * 参  数: QFile  &KrcFile   要解码的krc文件
 *        QFile  &LrcFile   解码后的lrc文件
 * 返回值: 类型 CONVERT_CODE
 *        如果函数执行成功, 返回CONVERT_SUCCESS;
 */
CONVERT_CODE  KrcDecode(QFile  &KrcFile, QFile  &LrcFile)
{
    CONVERT_CODE  nRet = CONVERT_PARA_ERR;
 
    if (KrcFile.isOpen() != false && LrcFile.isOpen() != false)
    {
        QByteArray   KrcData;
        QByteArray   DecodeData;
        QByteArray   LrcData;
 
        KrcFile.seek(0);
        KrcData = KrcFile.readAll();
 
        if (false == KrcData.isEmpty())
        {
            // 校验开头 4 字符是否为正确
            if (KrcData.left(4) == "krc1")
            {
                KrcData.remove(0, 4);  // 去除文件头标识
 
                // XOR 大法解码
                for (int i = 0; i < KrcData.size(); i++)
                {
                    DecodeData.append((char)(KrcData[i] ^ Keys[i % 16]));
                }
                // 解压缩数据
                if (ZlibUncompress(LrcData, DecodeData, NULL) != -1)
                {
                    LrcFile.write(LrcData);
 
                    nRet = CONVERT_SUCCESS;
                }
                else
                {
                    nRet = CONVERT_FORMAT_ERR;
                }
            }
            else
            {
                nRet = CONVERT_FORMAT_ERR;
            }
        }
        else
        {
            nRet = CONVERT_FILE_EMPTY;
        }
    }
    return nRet;
}


你可能感兴趣的:(qt)