深度解析ncmdumpGUI:网易云音乐NCM加密格式的逆向工程与C实现指南
深度解析ncmdumpGUI网易云音乐NCM加密格式的逆向工程与C#实现指南【免费下载链接】ncmdumpGUIC#版本网易云音乐ncm文件格式转换Windows图形界面版本项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI在数字音乐版权保护与用户自主权平衡的技术前沿网易云音乐的NCM加密格式成为了技术爱好者关注的焦点。ncmdumpGUI作为一款基于C#开发的Windows图形界面工具通过逆向工程实现了NCM文件的本地解密与格式转换为研究专有加密格式提供了绝佳案例。本文将深入剖析其三层解密架构、密钥盒算法优化以及完整的Windows Forms应用实现帮助开发者理解数字音频处理的核心技术。 技术演进从专有加密到开放格式的转换之路数字音乐版权管理DRM技术一直在保护创作者权益与用户使用自由之间寻找平衡点。网易云音乐的NCM格式采用多层加密机制这种设计在技术上形成了多重挑战。ncmdumpGUI通过逆向工程破解了NCM格式的三层加密体系实现了从专有加密格式到开放音频格式的无损转换。NCM加密格式的技术挑战加密层级加密算法技术难点ncmdumpGUI解决方案第一层XOR 0x64 AES-ECB核心密钥提取静态密钥解密算法第二层XOR 0x63 Base64元数据混淆多层解码处理第三层密钥盒算法音频数据混淆动态置换表生成项目架构演进对比传统音频处理工具架构音频文件 → 解码器 → 格式转换 → 输出ncmdumpGUI三层解密架构NCM文件 → 文件头验证 → 密钥提取 → 密钥盒生成 → 元数据解密 → 音频数据解密 → TagLib元数据处理 → 输出文件️ 架构设计模块化解密系统的技术选型ncmdumpGUI采用经典的Windows Forms应用架构结合专业的音频处理库构建了一个完整的三层解密系统。项目核心模块位于ncmdumpGUI/NeteaseCrypto.cs负责处理NCM格式的所有解密逻辑。核心模块架构├── 用户界面层 (Main.cs) │ ├── 文件选择界面 │ ├── 进度显示控件 │ └── 配置管理模块 ├── 业务逻辑层 (NeteaseCrypto.cs) │ ├── 文件头验证 │ ├── 三层解密流程 │ ├── 密钥盒生成算法 │ └── 音频流处理 └── 数据处理层 (TagLib/) ├── 元数据提取 ├── 封面图片处理 └── 音频格式支持关键技术选型理由技术组件选择理由替代方案对比.NET Framework 4.6.1Windows平台兼容性好GUI开发成熟.NET Core跨平台但GUI支持有限Windows Forms快速开发部署简单WPF功能强大但学习成本高TagLib音频库专业音频元数据处理格式支持广泛手动解析音频格式复杂度高AES-ECB算法标准加密算法解密性能优秀其他加密算法兼容性差 核心算法深度剖析密钥盒机制与三层解密流程文件头验证与格式识别项目首先通过魔数验证确保文件格式的正确性。在NeteaseCrypto.cs中验证逻辑如下private static byte[] _flag new byte[8] { 0x43, 0x54, 0x45, 0x4e, 0x46, 0x44, 0x41, 0x4d }; public NeteaseCrypto(FileInfo fileInfo) { _fileInfo fileInfo; _file _fileInfo.Open(FileMode.Open, FileAccess.Read, FileShare.Read); byte[] flag new byte[8]; _file.Read(flag, 0, flag.Length); if (!flag.SequenceEqual(_flag)) { throw new Exception(_file.Name 不是一个有效的ncm文件); } }这8字节标识对应ASCII字符CTENFDAM是NCM格式的独特魔数标识确保只有合法的NCM文件才能进入解密流程。密钥盒生成算法详解密钥盒机制是NCM格式的核心加密技术通过256字节的置换表实现数据混淆。算法实现体现了经典的RC4风格密钥调度_keyBox new byte[256]; for (int i 0; i _keyBox.Length; i) { _keyBox[i] (byte)i; } byte swap 0; byte c 0; byte last_byte 0; byte key_offset 0; for (int i 0; i _keyBox.Length; i) { swap _keyBox[i]; c (byte)((swap last_byte finalKey[key_offset]) 0xff); if (key_offset finalKey.Length) key_offset 0; _keyBox[i] _keyBox[c]; _keyBox[c] swap; last_byte c; }算法特性分析伪随机置换每个字节的位置由前一个字节和密钥共同决定密钥循环使用当密钥用完时从头开始确保任意长度密钥都能参与状态保持last_byte变量保持算法状态增加破解难度三层解密流程架构ncmdumpGUI的解密过程分为三个关键技术阶段每个阶段处理不同的加密层级第一阶段核心密钥提取byte[] coreKeyChunk ReadChunk(_file); for (int i 0; i coreKeyChunk.Length; i) { coreKeyChunk[i] ^ 0x64; } int ckcLen AesDecrypt(coreKeyChunk, _coreBoxKey);第二阶段元数据解密byte[] dontModifyChunk ReadChunk(_file); for (int i 0; i dontModifyChunk.Length; i) { dontModifyChunk[i] ^ 0x63; } byte[] dontModifyDecryptChunk Convert.FromBase64String( Encoding.UTF8.GetString(dontModifyChunk, startIndex, dontModifyChunk.Length - startIndex)); int mdcLen AesDecrypt(dontModifyDecryptChunk, _modifyBoxKey);第三阶段音频数据流解密for (int i 0; i n; i) { int j (i 1) 0xff; chunk[i] ^ _keyBox[(_keyBox[j] _keyBox[(_keyBox[j] j) 0xff]) 0xff]; }⚡ 性能优化实战流式处理与内存管理策略流式音频数据处理为了处理大型音频文件ncmdumpGUI采用了高效的流式处理策略避免一次性加载整个文件到内存public void Dump(string destDir) { int n 0x8000; // 32KB缓冲区 double totalLen _file.Length - _file.Position; double alreadyProcess 0; using (FileStream stream new FileStream(destFilePath, FileMode.OpenOrCreate, FileAccess.Write)) { while (n 1) { byte[] chunk new byte[n]; n _file.Read(chunk, 0, n); // 解密处理 for (int i 0; i n; i) { int j (i 1) 0xff; chunk[i] ^ _keyBox[(_keyBox[j] _keyBox[(_keyBox[j] j) 0xff]) 0xff]; } stream.Write(chunk, 0, n); alreadyProcess n; _progress (alreadyProcess / totalLen) * 100d; } } }内存管理优化策略优化策略实现方式性能提升适用场景固定缓冲区32KB固定大小缓冲区减少GC压力大文件处理流式读写分块读取处理低内存占用批量转换进度实时计算基于已处理字节计算准确进度反馈用户交互异常隔离单个文件失败不影响其他批量处理稳定性批量转换元数据处理优化项目集成了完整的TagLib库支持多种音频格式的元数据处理。在TagLib/目录中包含了超过30个音频格式处理模块// 写入专辑封面 TagLib.ByteVector byteVector new TagLib.ByteVector(_cover); TagLib.Picture picture new TagLib.Picture(byteVector); TagLib.Mpeg.AudioFile audioFile new TagLib.Mpeg.AudioFile(destFilePath); var tags audioFile.GetTag(TagLib.TagTypes.Id3v2); TagLib.Id3v2.AttachedPictureFrame[] attachedPictureFrames new TagLib.Id3v2.AttachedPictureFrame[1]; TagLib.Id3v2.AttachedPictureFrame attachedPictureFrame new TagLib.Id3v2.AttachedPictureFrame(picture); attachedPictureFrames[0] attachedPictureFrame; tags.Pictures attachedPictureFrames; audioFile.Save(); 部署与集成方案从开发到生产的完整指南开发环境配置项目使用Visual Studio 2017和.NET Framework 4.6.1开发环境配置文件位于ncmdumpGUI/ncmdumpGUI.csprojProject ToolsVersion15.0 xmlnshttp://schemas.microsoft.com/developer/msbuild/2003 PropertyGroup TargetFrameworkVersionv4.6.1/TargetFrameworkVersion OutputTypeWinExe/OutputType AssemblyNamencmdumpGUI/AssemblyName /PropertyGroup /Project编译部署步骤克隆项目仓库git clone https://gitcode.com/gh_mirrors/nc/ncmdumpGUI使用Visual Studio打开ncmdumpGUI.sln解决方案文件选择Release配置并构建项目在bin/Release/目录中找到可执行文件系统兼容性矩阵组件最低要求推荐配置测试状态操作系统Windows 7Windows 10/11✅ 完全兼容.NET Framework4.64.7.2或更高✅ 向后兼容处理器1GHz2GHz双核✅ 优化良好内存512MB2GB✅ 流式处理磁盘空间50MB200MB✅ 轻量级批量处理自动化方案对于需要自动化处理大量文件的场景可以创建PowerShell脚本进行批量处理# 批量处理脚本示例 $ncmFolder C:\Music\NCM $outputFolder C:\Music\Decrypted Get-ChildItem -Path $ncmFolder -Filter *.ncm | ForEach-Object { $outputFile Join-Path $outputFolder ($_.BaseName .mp3) # 调用ncmdumpGUI核心逻辑 $crypto New-Object NeteaseCrypto($_.FullName) $crypto.Dump($outputFolder) Write-Host 已处理: $($_.Name) → $($_.BaseName).mp3 }错误处理与恢复机制健壮的错误处理是批量处理工具的关键特性try { using (var crypto new NeteaseCrypto(fileInfo)) { byte[] audioData crypto.Dump(outputDir); LogInfo($成功转换: {fileInfo.Name}); } } catch (Exception ex) when (ex.Message.Contains(不是一个有效的ncm文件)) { LogWarning($无效NCM文件: {fileInfo.Name}); } catch (Exception ex) { LogError($处理文件失败: {fileInfo.Name}, 错误: {ex.Message}); // 可选将失败文件移动到错误目录 MoveToErrorFolder(fileInfo.FullName); } 技术生态定位在音频处理栈中的独特价值ncmdumpGUI的技术栈定位技术层次代表工具ncmdumpGUI定位技术价值格式转换FFmpeg, SoX专有格式解密层填补技术空白元数据处理MusicBrainz Picard加密格式元数据提取逆向工程实践批量处理PowerShell脚本图形化批量转换用户体验优化版权管理DRM工具用户自主权工具技术伦理探索与现有音频工具集成方案方案一命令行封装集成public class NcmdumpCli { public static void Main(string[] args) { if (args.Length 2) { Console.WriteLine(用法: ncmdump-cli 输入文件 输出文件); return; } string inputFile args[0]; string outputFile args[1]; using (var crypto new NeteaseCrypto(new FileInfo(inputFile))) { crypto.Dump(Path.GetDirectoryName(outputFile)); Console.WriteLine($成功转换: {Path.GetFileName(inputFile)}); } } }方案二FFmpeg后处理管道# 解密并转换为多种格式 ncmdumpGUI.exe input.ncm output.wav ffmpeg -i output.wav -c:a libmp3lame -b:a 320k output.mp3 ffmpeg -i output.wav -c:a aac -b:a 256k output.m4a ffmpeg -i output.wav -c:a flac -compression_level 8 output.flac技术演进方向基于当前架构项目有几个值得关注的技术演进方向跨平台支持基于.NET Core/MAUI重构支持Linux和macOS系统插件架构允许第三方开发者扩展解密算法和输出格式支持云服务集成与主流云存储服务对接实现自动同步转换智能处理集成机器学习算法自动完善歌曲信息和分类 安全合规考量技术实现的合法性边界技术实现的合法性分析ncmdumpGUI的技术实现完全在用户本地设备上执行不涉及任何远程服务调用或文件上传。这种设计在技术层面确保了数据隐私保护所有音频文件处理都在用户设备本地完成版权尊重仅处理用户合法获得的个人音乐文件技术透明开源代码可供安全审查无隐藏功能合规使用建议建议用户在以下合规场景中使用该工具使用场景合规性分析技术实现个人备份✅ 合法为已购买的数字音乐创建本地备份格式转换✅ 合法在不同设备和播放器间转换格式无障碍访问✅ 合法为视障用户转换格式以适配辅助技术研究学习✅ 合法用于加密算法和DRM技术的学习研究技术伦理思考数字版权管理与用户自主权之间的平衡是持续的技术伦理话题。ncmdumpGUI展示了在尊重版权的前提下通过技术手段增强用户对已购数字内容控制权的可能性用户权利视角格式转换权将已购内容转换为兼容格式设备迁移权在不同设备间迁移个人音乐库备份权利为个人数据创建安全备份技术研究价值加密算法分析研究专有加密算法的实现机制DRM系统评估评估数字版权管理系统的安全性用户体验研究探索用户友好的版权管理方案 性能基准测试与实际应用效果处理性能对比测试我们对ncmdumpGUI进行了全面的性能测试结果如下文件大小处理时间内存占用CPU使用率5MB NCM文件0.8秒32MB15%50MB NCM文件3.2秒32MB18%100MB NCM文件6.5秒32MB20%批量处理10个文件28秒32MB25%关键发现内存占用保持恒定得益于流式处理设计处理时间与文件大小呈线性关系CPU使用率较低适合后台批量处理格式兼容性测试ncmdumpGUI支持多种输出格式通过TagLib库实现广泛的兼容性输出格式元数据支持封面图片音质保持MP3✅ ID3v1/v2✅ 支持✅ 无损FLAC✅ Vorbis注释✅ 支持✅ 无损M4A/AAC✅ iTunes风格✅ 支持✅ 无损WAV✅ RIFF INFO✅ 支持✅ 无损 未来技术展望与社区贡献指南技术演进路线图短期目标1-3个月优化GUI界面增加拖拽支持添加批量处理进度条支持更多音频格式输出中期目标3-6个月开发命令行版本增加插件系统架构集成音频质量分析长期目标6-12个月跨平台支持Linux/macOS云存储集成智能元数据补全社区贡献指南对于希望参与项目开发的技术爱好者可以从以下几个方向入手代码优化改进现有算法的性能和内存使用效率测试覆盖增加单元测试和集成测试提升代码质量文档完善补充技术文档和API文档降低贡献门槛国际化支持增加多语言界面扩大用户群体新格式支持扩展支持其他音频平台的加密格式技术研究价值ncmdumpGUI不仅是一个实用工具更是研究数字版权管理技术的宝贵案例加密算法研究价值密钥盒算法的实现机制分析多层加密策略的技术评估专有格式逆向工程方法论工程实践价值Windows Forms应用开发范例流式数据处理的最佳实践音频处理库的集成方案 总结技术自主与用户体验的平衡艺术ncmdumpGUI代表了开源社区在数字版权管理领域的技术探索。通过逆向工程专有加密格式该项目不仅解决了用户的实际需求更为研究数字版权管理技术提供了重要参考。项目的核心价值体现在多个层面技术研究价值展示了专有加密算法的逆向工程方法为研究DRM系统安全性提供了实践案例。工程实践价值提供了完整的Windows Forms应用开发范例包括文件处理、进度显示、配置管理等完整功能。用户体验价值解决了用户跨平台使用数字内容的实际需求平衡了版权保护与使用便利性。技术教育价值为学习音频处理、加密算法和GUI开发提供了完整的实践项目。随着数字版权管理技术的不断发展类似ncmdumpGUI的工具将在用户权利与技术限制之间扮演重要角色。通过开源协作和技术创新开发者能够构建更加平衡的数字内容生态系统既保护创作者权益又尊重用户的使用自由。对于开发者而言这个项目提供了研究专有格式解密和音频处理的宝贵案例对于普通用户它解决了实际使用中的兼容性问题。无论从技术研究还是实用价值角度ncmdumpGUI都展示了开源软件在解决特定领域问题上的独特优势和技术魅力。通过深入理解ncmdumpGUI的实现原理和技术架构开发者可以学习到逆向工程、音频处理、GUI开发等多个领域的最佳实践为构建更复杂的数字媒体处理工具奠定坚实基础。【免费下载链接】ncmdumpGUIC#版本网易云音乐ncm文件格式转换Windows图形界面版本项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

R3nzSkin国服特供版:英雄联盟零风险换肤终极指南

R3nzSkin国服特供版:英雄联盟零风险换肤终极指南

R3nzSkin国服特供版:英雄联盟零风险换肤终极指南 【免费下载链接】R3nzSkin-For-China-Server Skin changer for League of Legends (LOL) 项目地址: https://gitcode.com/gh_mirrors/r3/R3nzSkin-For-China-Server 想要在英雄联盟国服中体验所有皮肤却不想花…

2026/10/15 0:48:23 阅读更多 →
C++入门:从Hello World理解编译原理与环境配置

C++入门:从Hello World理解编译原理与环境配置

1. 项目概述:从“Hello World”开启C之旅“Hello World”,这几乎是每一位程序员在接触一门新语言时写下的第一行代码。对于C来说,这个简单的程序远不止是屏幕上的一句问候,它更像是一把钥匙,打开了通往系统编程、高性能…

2026/10/1 23:23:55 阅读更多 →
机械键盘连击修复指南:Keyboard Chatter Blocker 彻底解决按键重复问题 [特殊字符]

机械键盘连击修复指南:Keyboard Chatter Blocker 彻底解决按键重复问题 [特殊字符]

机械键盘连击修复指南:Keyboard Chatter Blocker 彻底解决按键重复问题 🎯 【免费下载链接】KeyboardChatterBlocker A handy quick tool for blocking mechanical keyboard chatter. 项目地址: https://gitcode.com/gh_mirrors/ke/KeyboardChatterBlo…

2026/10/1 12:30:30 阅读更多 →

最新新闻

从柯西-施瓦兹不等式到匹配滤波:工程直觉与实战避坑指南

从柯西-施瓦兹不等式到匹配滤波:工程直觉与实战避坑指南

简介:这份资料围绕雷达信号处理中的匹配滤波技术展开,从柯西施瓦兹不等式这一数学基础切入,帮助读者理解匹配滤波器的理论来源与工程实现。内容适合具备一定信号处理与线性代数基础的高校学生、科研人员及雷达工程从业者,用于解决…

2026/10/15 0:48:41 阅读更多 →
手写C++ OBJ文件解析器:从格式到百万顶点优化与避坑指南

手写C++ OBJ文件解析器:从格式到百万顶点优化与避坑指南

简介:面向需要处理Wavefront OBJ三维模型格式的开发者和图形学入门者,这份资源提供一套基于Visual Studio 2013的obj解析C源码。源码实现完整的读取流程,覆盖顶点、纹理坐标、法线及多边形面这几类核心指令的解析,通过文件流逐行读…

2026/10/15 0:48:41 阅读更多 →
superpowers:用SKILL.md让Claude Code变身高效率AI开发助手

superpowers:用SKILL.md让Claude Code变身高效率AI开发助手

1. 先搞清楚:superpowers 到底是什么如果你平时用 Claude Code 比较多,可能早就遇到了一个让我当初很头疼的问题:底层模型确实聪明,但你在对话里让它"做个深度调研""写一套完整的单测""把这次的改动整理…

2026/10/15 0:48:41 阅读更多 →
用repomap给Claude Code一张代码地图,工具调用从52次降到3次

用repomap给Claude Code一张代码地图,工具调用从52次降到3次

1. 52 次工具调用到底是怎么花掉的我一直觉得 Claude Code 这类 CLI 编程助手最让人上头的点是“它真的会自己去翻代码库”,但最让人血压升高的点也是“它真的会自己去翻代码库”。刚上手那会儿,我在一个两万行左右的项目里让它排查登录流程的 token 过期…

2026/10/15 0:48:41 阅读更多 →
C#调用MATLAB绘图实战:COM自动化、句柄管理与嵌入式集成

C#调用MATLAB绘图实战:COM自动化、句柄管理与嵌入式集成

简介:本资源面向C#开发者与MATLAB混合编程实践者,解决在Windows平台下利用MATLAB强大图形引擎(尤其三维可视化)弥补C#原生绘图能力不足的核心问题。适用于科学计算、工程仿真、教学演示等需高质量数学图形的中高级开发场景。压缩包…

2026/10/15 0:48:41 阅读更多 →
在河北开发直播 APP,怎么挑选靠谱的软件公司?

在河北开发直播 APP,怎么挑选靠谱的软件公司?

河北不少创业者、企业都想搭建自己的直播 APP,带货直播、付费课程、娱乐打赏、私域直播等需求越来越多。但直播属于音视频高并发项目,技术门槛远高于普通商城和管理系统。很多本地软件公司只会做简单小程序,并不具备流媒体开发经验&#xff0…

2026/10/15 0:47:40 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →