C# 20行代码解析KRC歌词内容
生活随笔
收集整理的這篇文章主要介紹了
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
總結
以上是生活随笔為你收集整理的C# 20行代码解析KRC歌词内容的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: schema学习系列三: sc
- 下一篇: Symbian学习笔记(22) - 关于