kgtemp文件是酷我音乐软件的缓存文件,本文从技术层面探讨如何解密该文件为mp3文件,并通过读取ID3信息来重命名。

kgtemp解密

kgtemp文件前1024个字节是固定的包头信息,解密方案详细可以参见(http://www.cnblogs.com/KMBlog/p/6877752.html):

class Program
{
static void Main(string[] args)
{ byte[] key={0xAC,0xEC,0xDF,0x57};
using (var input = new FileStream(@"E:\KuGou\Temp\236909b6016c6e98365e5225f488dd7a.kgtemp", FileMode.Open, FileAccess.Read))
{
var output = File.OpenWrite(@"d:\test.mp3");//输出文件
input.Seek(1024, SeekOrigin.Begin);//跳过1024字节的包头
byte[] buffer = new byte[key.Length];
int length;
while((length=input.Read(buffer,0,buffer.Length))>0)
{
for(int i=0;i<length;i++)
{
var k = key[i];
var kh = k >> 4;
var kl = k & 0xf;
var b = buffer[i];
var low = b & 0xf ^ kl;//解密后的低4位
var high = (b >> 4) ^ kh ^ low & 0xf;//解密后的高4位
buffer[i] = (byte)(high << 4 | low);
}
output.Write(buffer, 0, length);
}
output.Close();
}
Console.WriteLine("按任意键退出...");
Console.ReadKey();
}
}

这样解密出来就是mp3文件了

读取ID3信息

解密出来的文件还需要手动命名,不是很方便,可以读取ID3V1信息重命名文件。

ID3V1比较简单,它是存放在MP3文件的末尾,用16进制的编辑器打开一个MP3文件,查看其末尾的128个顺序存放字节,数据结构定义如下:

char Header3; /标签头必须是"TAG"否则认为没有标签/

char Title[30]; /标题/

char Artist[30]; /作者/

char Album[30]; /专集/

char Year4; /出品年代/

char Comment[30]; /备注/

char Genre; /类型,流派/

解析代码比较简单,注意中文歌曲用GBK编码就可以了:

  private static Mp3Info FormatMp3Info(byte[] Info, System.Text.Encoding Encoding)
{
Mp3Info myMp3Info = new Mp3Info();
string str = null;
int i;
int position = 0主要代码jia,; //循环的起始值
int currentIndex = 0; //Info的当前索引值 //获取TAG标识
for (i = currentIndex; i < currentIndex + 3; i++)
{
str = str + (char)Info[i];
position++;
}
currentIndex = position;
myMp3Info.identify = str; //获取歌名
str = null;
byte[] bytTitle = new byte[30]; //将歌名部分读到一个单独的数组中
int j = 0;
for (i = currentIndex; i < currentIndex + 30; i++)
{
bytTitle[j] = Info[i];
position++;
j++;
}
currentIndex = position;
myMp3Info.Title = ByteToString(bytTitle, Encoding); //获取歌手名
str = null;
j = 0;
byte[] bytArtist = new byte[30]; //将歌手名部分读到一个单独的数组中
for (i = currentIndex; i < currentIndex + 30; i++)
{
bytArtist[j] = Info[i];
position++;
j++;
}
currentIndex = position;
myMp3Info.Artist = ByteToString(bytArtist, Encoding); //获取唱片名
str = null;
j = 0;
byte[] bytAlbum = new byte[30]; //将唱片名部分读到一个单独的数组中
for (i = currentIndex; i < currentIndex + 30; i++)
{
bytAlbum[j] = Info[i];
position++;
j++;
}
currentIndex = position;
myMp3Info.Album = ByteToString(bytAlbum, Encoding); //获取年
str = null;
j = 0;
byte[] bytYear = new byte[4]; //将年部分读到一个单独的数组中
for (i = currentIndex; i < currentIndex + 4; i++)
{
bytYear[j] = Info[i];
position++;
j++;
}
currentIndex = position;
myMp3Info.Year = ByteToString(bytYear, Encoding); //获取注释
str = null;
j = 0;
byte[] bytComment = new byte[28]; //将注释部分读到一个单独的数组中
for (i = currentIndex; i < currentIndex + 25; i++)
{
bytComment[j] = Info[i];
position++;
j++;
}
currentIndex = position;
myMp3Info.Comment = ByteToString(bytComment, Encoding); //以下获取保留位
myMp3Info.reserved1 = (char)Info[++position];
myMp3Info.reserved2 = (char)Info[++position];
myMp3Info.reserved3 = (char)Info[++position]; //
return myMp3Info;
}

转换小工具

写了一个小工具,来进行转换

下载地址:https://pan.baidu.com/s/1o7FIsPk

PS:上面只读取了IDV1,部分歌曲可能不存在

可以下载@缤纷 提供的程序,增加了ID3V2的支持:

https://files.cnblogs.com/files/gxlxzys/kgtemp文件转mp3工具.zip


作者:Jadepeng

出处:jqpeng的技术记事本--http://www.cnblogs.com/xiaoqi

您的支持是对博主最大的鼓励,感谢您的认真阅读。

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

kgtemp文件转mp3工具的更多相关文章

  1. 酷狗歌曲缓存kgtemp转mp3工具

    一直用网易音乐听歌,不过网易的歌曲版权确实是少了一些,在酷狗上可以找到,但收费歌曲只能试听不能下载. 寻找方案 从设置里可以看出,酷狗会设置缓存目录,试听的歌曲存放到这个缓存里. 打开缓存目录: 可以 ...

  2. 开源小工具 酷狗、网易音乐缓存文件转mp3工具

    发布一个开源小工具,支持将酷狗和网易云音乐的缓存文件转码为MP3文件. 以前写过kgtemp文件转mp3工具,正好当前又有网易云音乐缓存文件需求,因此就在原来小工具的基础上做了一点修改,增加了对网易云 ...

  3. PCM转MP3工具的封装

    PCM转MP3工具的封装 说明 1. 对 PCM 转 MP3 进行了简单的封装. 2. 使用 https://github.com/wuqiong/mp3lame-for-iOS 生成支持64位的 l ...

  4. TortoiseGit 文件比对工具使用 Beyond Compare 和 DiffMerge

    TortoiseGit 内置的文件比对工具是 TortoiseMerge,用于文件比对和解决冲突合并,TortoiseGit 还支持外部的比对工具使用,比如 Beyond Compare 和 Diff ...

  5. java swing文件内容检索工具

    Java相关技术 - 文件内容检索工具 拿到一个几百M甚至上G的project让你去学习 有时候你会想知道某个关键词是在哪个文件里 比如:spring MVC配置的@RequestMapping,你从 ...

  6. 用C#Winform写个简单的批量清空文件内容和删除文件的小工具

    用C#Winform写个简单的批量清空文件内容和删除文件的小工具 本文介绍这个简单得不能再简单的小项目.做这个项目,有以下目的. 1 当然是做个能用的工具 2 学习使用Github 关于用VS2013 ...

  7. 文件比对工具(Beyond Compare)

    文件比对工具: 工具名称:Beyond Compare 版本号:v3.3.13 下载地址:http://i.cnblogs.com/Files.aspx 官网最新版本下载地址:http://www.s ...

  8. pscp使用详解 Windows与Linux文件互传工具

    pscp使用详解 Windows与Linux文件互传工具 pscp使用方法详解:pscp是putty安装包所带的远程文件传输工具,是一款十分常见windows与linux系统之间文件互传的工具,使用方 ...

  9. 文件上传工具类 UploadUtil.java

    package com.util; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import ja ...

随机推荐

  1. 用call/cc合成所有的控制流结构

    用call/cc合成所有的控制流结构 来源 https://www.jianshu.com/p/e860f95cad51 call/cc 是非常.非常特殊的,因为它根本无法用 Lambda 演算定义. ...

  2. 【题解】 bzoj2460: [BeiJing2011]元素 (线性基)

    bzoj2460,戳我戳我 Solution: 线性基板子,没啥好说的,注意long long 就好了 Code: //It is coded by Ning_Mew on 5.29 #include ...

  3. 【BZOJ1071】[SCOI2007]组队(神仙题)

    [BZOJ1071][SCOI2007]组队(神仙题) 题面 BZOJ 洛谷 题解 首先把式子整理一下,也就是\(A*h+B*v\le C+A*minH+B*minV\) 我们正常能够想到的做法是钦定 ...

  4. 【转】C/C++位域结构深入解析

    C/C++位域结构深入解析 内存是以字节为单位进行编址的,编程语言的基本类型中,最小类型的长度一般也就是1个字节.然而,在解决某些问题时,必须要有二进制层面的表达手段(见本博客的自己动手实现DNS协议 ...

  5. Java实现的一个简单的模板渲染

    代码 package com.hdwang; import java.util.HashMap; import java.util.Map; /** * Created by hdwang on 20 ...

  6. Python之旅:MySQL系列

    第一篇:初识数据库 第二篇:库操作 第三篇:表操作 第四篇:数据操作 第五篇:索引原理与慢查询优化 第六篇:数据备份.pymysql模块 第七篇:视图.触发器.事务.存储过程.函数 第八篇:ORM框架 ...

  7. 位运算符和unity Layers

    按位运算符:与(&).非(~).或(|).异或(^).<<(左移).>>(右移).位运算符主要用来对二进制位进行操作. 逻辑运算符:&&.||.!.逻辑 ...

  8. 图解MySQL 内连接、外连接

    2.内连接(INNER JOIN)内连接(INNER JOIN):有两种,显式的和隐式的,返回连接表中符合连接条件和查询条件的数据行.(所谓的链接表就是数据库在做查询形成的中间表).例如:下面的语句3 ...

  9. [国家集训队2012]middle

    http://cogs.pro:8080/cogs/problem/problem.php?pid=1763 二分答案x 把区间内>=x的数设为1,<x的数设为-1 左端点在[a,b]之间 ...

  10. HDU 1241 Oil Deposits DFS搜索题

    题目大意:给你一个m*n的矩阵,里面有两种符号,一种是 @ 表示这个位置有油田,另一种是 * 表示这个位置没有油田,现在规定相邻的任意块油田只算一块油田,这里的相邻包括上下左右以及斜的的四个方向相邻的 ...