前一章介绍了如何使用Qt解压酷狗KRC本章继续介绍如何使用文件C 解压酷狗KRC文件。 前章链接:Qt解压酷狗KRC文件 注:该文件为64位动态库文件,包括:zconf.h、zlib.h、zlib.lib、zlib.dll 运行环境:VS2017 百度网盘地址:(https://pan.baidu.com/s/1IsvkVeZQ6ipPJUIjhZaQaw) 提取码:otmf
#include <iostream> #include <fstream> #include "include/zconf.h" #include "include/zlib.h" using namespace std; void toLrcFile(const string &krcFileName, const string &lrcFileName) { ///密码字节数组(解码前) Bytef *encodeKrcBuffer = nullptr; ///解码字节数组(解码后) Bytef *decodeKrcBuffer = nullptr; //解压后lrc字节数组 Bytef *lrcBuffer = nullptr; ifstream fin(krcFileName, ios::in | ios::binary); //打开二进制读模式krc文件 if (fin.is_open()) { fin.seekg(0, ios::end); ///将文件指针移动到文件末尾的位置 int size = fin.tellg(); ///获取文件指针位置(此位置为文件长度) fin.clear(); //请注意,如果已经在文件末尾,则必须在调用此函数之前清除文件末尾的标志。 fin.seekg(0, ios::beg); ///将文件指针移动到文件开始位置 encodeKrcBuffer = new Bytef[size]; memset(encodeKrcBuffer, 0, size); fin.read((char *)encodeKrcBuffer, size); fin.close(); if (encodeKrcBuffer[0] == 'k' && encodeKrcBuffer[1] == 'r' && encodeKrcBuffer[2] == 'c' && encodeKrcBuffer[3] == '1') { //去除文件头标识 memcpy(encodeKrcBuffer, encodeKrcBuffer 4, size - 4); } decodeKrcBuffer = new Bytef[size - 4]; const int Keys[] = {64, 71, 97, 119, 94, 50, 116, 71, 81, 54, 49, 45, 206, 210, 110, 105}; for (int i = 0; i < size - 4; i ) { //xor法解码 decodeKrcBuffer[i] = encodeKrcBuffer[i] ^ Keys[i % 16]; } //定义解压后文件的预期长度倍率,若下方ret返回值为-5,说明解压内存(lrcBuffer)不够,继续增加倍率 const int LRC_BUFFER_LEN_RATIO = 4; ///定义解压后文件的预期大小 uLongf lrcBufferLen = (size - 4) * LRC_BUFFER_LEN_RATIO; lrcBuffer = new Bytef[lrcBufferLen]; ///解压文件 int ret = uncompress(lrcBuffer, &lrcBufferLen, decodeKrcBuffer, (uLong)(size - 4)); if (ret != Z_OK) return; //写入lrc文件 ofstream fout(lrcFileName, ios::out | ios::binary); if (fout.is_open()) { fout.write((char *)lrcBuffer, lrcBufferLen); fout.close(); } } } int main() { string krcFileName = string("C:/Users/11864/Desktop/李常超 - 盗墓笔记·十年人间-f17fc56e5a5a474bb182dc3c694ab0a4-42388467-00000000.krc"); string lrcFileName = string("C:/Users/11864/Desktop/ShiNianRenJian.lrc"); toLrcFile(krcFileName, lrcFileName); return 0; }