按照http://www.52pojie.cn/thread-286822-1-1.html 的方法,用楼主提供的E语言代码,改写了一个C++的。程序用到了Zlib库进行解码,请参看我上一篇文章。(http://blog.csdn.net/sunnysab/article/details/46672949)。 解码的方法很简单,所以代码也不长。首先读入文本,然后与Keys进行异或操作,再使用Zlib库进行解压缩。解压缩后的数据如图:
只是不知道每个字之前的标签代表的是什么意思。代码如下:
#include <QCoreApplication>
#include <QFile>
#include <QDebug>
#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;
}