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 编码可以获得可读内容
使用包 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