C# 20行代码解析KRC歌词内容

C# 20行代码解析KRC歌词内容

文章内容仅供学习参考,禁止转载。

KRC 歌词文件支持了逐字精准,解决了一行歌词进度显示不准确的问题。由此好奇其存储歌词的方式,于是参考网络其他资料总结如下:

KRC 文件的前 4 字节是文件类型标识,使用记事本打开任意 KRC 文件可以查看前 4 字节为类似 krc1 的字符

krc18烫烫烫烫烫烫烫烫烫...

krc18 中的 8 并不是KRC标识,在后面的解析中你会发现 8 是压缩流的头标识

去除前 4 字节,对剩下的所有字节对 key 进行异或运算

key 为 64, 71, 97, 119, 94, 50, 116, 71, 81, 54, 49, 45, 206, 210, 110, 105 共计 16 个,异或运算时循环处理。

异或结束后得到的是经过 zlib 默认压缩规则压缩后的字节流,所以需要先对其解压缩。

对解压缩后的字节流进行 UTF8 编码即可得到可阅读的内容

C# 代码如下

使用包 SharpZipLib 中封装的方法进行解压缩,你可以在 VS 包管理器中使用如下命令(或者参考 NuGet Gallery | SharpZipLib 1.3.3

Install-Package SharpZipLib -Version 1.3.3
// .NET 6 for C# 10 ConsoleAPP
using System.Text;
using ICSharpCode.SharpZipLib.Zip.Compression.Streams;

byte[] key = { 64, 71, 97, 119, 94, 50, 116, 71, 81, 54, 49, 45, 206, 210, 110, 105 };
var data = File.ReadAllBytes(@".\周杰伦 - 甜甜的.krc")[4..];
for (int i = 0; i < data.Length; i++)
    data[i] = (byte)(data[i] ^ key[i % key.Length]);
var res = Encoding.UTF8.GetString(FastDecompression(data));

Console.WriteLine(res);

static byte[] FastDecompression(byte[] data)
{
    MemoryStream decompressed = new();
    new InflaterInputStream(new MemoryStream(data)).CopyTo(decompressed);
    return decompressed.ToArray();
}

运行结果:

?[id:$0313BFDD]
[ar:周杰伦]
[ti:甜甜的]
[by:]
[hash:2165db629e5bd835f1b71ddae9fca4ed]
[al:]
[sign:]
[qq:]
[total:243000]
[offset:0]
[language:eyJjb250ZW50IjpbXSwidmVyc2lvbiI6MX0=]
[289,708]<0,503,0>周<503,0,0>杰<503,52,0>伦 <555,51,0>- <606,0,0>甜<606,51,0>甜<657,51,0>的
[997,153]<0,0,0>作<0,50,0>词<50,51,0>:<101,0,0>方<101,52,0>文<153,0,0>山
[1150,202]<0,50,0>作<50,50,0>曲<100,0,0>:<100,51,0>周<151,51,0>杰<202,0,0>伦
[1352,202]<0,50,0>编<50,51,0>曲<101,0,0>:<101,51,0>林<152,50,0>迈<202,0,0>可
[1585,4047]<0,253,0>我<253,203,0>轻<456,252,0>轻<708,507,0>地<1215,252,0>尝<1467,252,0>一<1719,508,0>口 <2227,303,0>你<2530,202,0>说<2732,557,0>的<3289,253,0>爱<3542,505,0>我
[5632,3137]<0,303,0>还<303,203,0>在<506,303,0>回<809,506,0>味<1315,251,0>你<1566,255,0>给<1821,507,0>过<2328,253,0>的<2581,305,0>温<2886,251,0>柔
...

可以发现每一行歌词都类似如下格式标记:

[此行歌词距歌曲开始时刻的毫秒数,此行持续的毫秒数]<此字距此行开始时刻的毫秒数,此字持续的毫秒数,0>字 ...

相关资源:C# 解析 KRC & ConsoleAPP

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值