Qt解压KRC文件

背景:
酷狗音乐歌词文件分为KRC文件和LRC,由于LRC文件只能将歌词显示的精度确定到行,因此需要解压KRC文件,并输入到LRC文件中,由此得到更加精准的能够将歌词显示精确到每一个字的LRC文件!
本章简单介绍一下,如何用Qt调用Zlib库来解压KRC文件。
解码前的KRC文件效果图
在这里插入图片描述
解码后的LRC文件效果图
在这里插入图片描述
LRC文件说明

以该首歌词的第一句为例:
[26317,2839]<0,657,0>光<657,405,0>是<1062,405,0>谁<1467,411,0>燃<1878,305,0>烛<2183,354,0>照<2537,302,0>亮 
中括号表示:[此行开始时刻距0时刻的毫秒数,此行持续的毫秒数]
尖括号表示:<此字开始时刻距此行开始时刻的毫秒数,此字持续的毫秒数,0>

核心代码

void toLrcFile(const QString &krcFileName, const QString &lrcFileName)
{
    QFile krcFile(krcFileName);
    QFile lrcFile(lrcFileName);
    if (!krcFile.open(QIODevice::ReadOnly))
        return;

    //密码字节数组(解码前)
    QByteArray encodeKrcBuffer = krcFile.readAll();
    //解码字节数组(解码后)
    QByteArray decodeKrcBuffer;
    //校验开头4字符
    if (encodeKrcBuffer.left(4) == "krc1")
    {
        //去除文件头标识
        encodeKrcBuffer.remove(0, 4);
        //xor法解码
        const int Keys[] = {64, 71, 97, 119, 94, 50, 116, 71, 81, 54, 49, 45, 206, 210, 110, 105};
        for (int i = 0; i < encodeKrcBuffer.size(); i++)
        {
            decodeKrcBuffer.append((char)(encodeKrcBuffer[i] ^ Keys[i % 16]));
        }
    }
    //注意:如果您想使用该函数来解压缩使用zlib压缩的外部数据,您首先需要在包含数据的字节数组前面加上一个四字节头。
    //标头必须包含未压缩数据的预期长度(以字节为单位),表示为无符号、大端、32位整数。
    //因此设计了下方添加的四个字节,无论大小端皆可使用
    decodeKrcBuffer.insert(0, '1');
    decodeKrcBuffer.insert(0, '0');
    decodeKrcBuffer.insert(0, '0');
    decodeKrcBuffer.insert(0, '1');
    //解压文件
    QByteArray lrcBuffer = qUncompress(decodeKrcBuffer);
    if (lrcFile.open(QIODevice::WriteOnly))
    {
        lrcFile.write(lrcBuffer);
        lrcFile.close();
    }
    krcFile.close();
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浮生卍流年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值