微信PC端dat文件解密:从异或加密原理到批量恢复实战
1. 项目概述从“乱码”到“宝藏”的探索如果你在清理电脑硬盘时无意间点开了微信PC版的缓存文件夹大概率会被一堆名为xxx.dat的文件搞得一头雾水。这些文件没有图标用记事本打开是乱码常规的图片查看器、视频播放器也拿它们没辙。它们就像微信在你电脑上留下的“数字暗语”静静地躺在WeChat Files\你的微信号\FileStorage等目录下里面可能藏着你几个月前随手保存的表情包、朋友发来的珍贵图片或者某个重要文档的缓存。最近“PC端微信的dat文件如何查看”成了不少技术爱好者和普通用户共同关注的话题尤其当需要找回一些未被主动保存的聊天图片或文件时这个需求就显得格外迫切。本质上微信出于保护用户隐私和优化存储的考虑对缓存到本地的图片、视频等文件进行了简单的异或加密并统一存储为.dat格式。所谓的“查看”核心就是破解这个加密将二进制乱码还原成可识别的JPG、PNG、GIF、PDF等原始格式。这个过程并不涉及高深的密码学更像是一场寻找“密钥”的解谜游戏。对于普通用户目标是找到一键转换的工具对于开发者或技术爱好者则是理解其加密原理甚至自己写脚本批量处理。接下来我将以一个“过来人”的身份带你彻底拆解这个问题的方方面面从原理分析、工具实战到深度定制让你不仅能解决问题更能明白背后的所以然。2. 核心原理深度拆解异或加密的“盾与矛”要打开.dat文件首先得明白微信对它做了什么。知其然更要知其所以然这能帮助你在使用工具或自行处理时遇到问题能自己判断原因。2.1 加密机制简单的异或运算微信PC版对缓存文件的加密采用的是一种非常基础的对称加密方式——异或XOR运算。你可以把它理解为一个“开关”相同的操作执行两次就能回到原点。它的核心规则是一个字节的数据与一个固定的密钥字节进行异或运算得到加密后的字节加密后的字节再与同一个密钥字节进行一次异或运算就能还原出原始数据。用公式表示就是明文字节 ^ 密钥 密文字节密文字节 ^ 密钥 明文字节这里的^就是异或运算符。微信并不是用一套复杂的算法加密整个文件而是将文件的每一个字节都与同一个密钥值进行异或。因此找到这个“密钥”就等于拿到了打开所有文件的万能钥匙。2.2 密钥的生成规律藏在文件头里的秘密密钥并非完全随机而是根据一定的规则生成的。经过大量文件的分析社区普遍认可的规律是密钥 第一个字节的ASCII码值 异或 一个固定值。对于图片文件JPG、PNG等这个固定值通常是0xFF。例如一个JPG文件的文件头第一个字节的十六进制值是0xFF那么计算密钥就是0xFF ^ 0xFF 0x00。但实际中微信加密后的.dat文件第一个字节已经被异或过了所以我们拿到的是密文的第一个字节。假设我们猜测原始文件是JPG其标准文件头第一个字节为0xFF那么我们可以用这个已知的0xFF去异或.dat文件的第一个字节来反推出密钥。更通用的方法是利用文件类型签名的固定性。例如JPG文件签名0xFF, 0xD8, 0xFFPNG文件签名0x89, 0x50, 0x4E, 0x47GIF文件签名0x47, 0x49, 0x46如果我们假设一个.dat文件原本是JPG那么它的前几个字节在加密前应该是FF D8 FF。用这个已知的明文去异或.dat文件的前几个字节密文理论上就能计算出密钥。由于是逐字节异或用第一个字节算出的密钥应该能成功解密第二个、第三个字节使其符合D8和FF这样才能验证密钥的正确性。注意这种规律是逆向工程得出的经验并非微信官方文档。在极少数情况下微信可能会更新加密方式但截至目前此方法对绝大多数历史文件依然有效。2.3 文件类型识别解密后的“验明正身”成功解密出一段二进制数据后我们还需要知道它原本是什么类型的文件以便用正确的扩展名.jpg, .png等保存它。这就是文件类型识别。最可靠的方法不是看扩展名而是看文件内容签名Magic Number。每种文件格式在文件的特定偏移位置都有固定的字节序列。例如JPG: 以字节FF D8开始以FF D9结束。PNG: 以字节89 50 4E 47 0D 0A 1A 0A开始。GIF: 以 ASCII 字符串GIF87a或GIF89a开始。解密后程序会读取文件头部字节与这些已知的签名进行比对从而确定文件类型。这也是为什么一些高级工具可以自动识别并转换因为它们内置了这套签名检测逻辑。3. 工具实战三种主流解决方案详解理解了原理我们就可以选择趁手的“兵器”了。根据你的技术背景和需求可以从以下三种方案中选择。3.1 方案一图形化工具小白首选对于绝大多数非技术用户图形化工具是最快捷、最安全的选择。这类工具通常封装了密钥计算、文件识别、批量转换等功能一键操作。推荐工具WeChatDatFileDecoder或类似GUI工具这是一款在GitHub等开发者社区中流传较广的绿色工具。它的典型操作流程如下定位缓存目录打开微信PC版点击左下角菜单 - 设置 - 文件管理点击“打开文件夹”。你会进入WeChat Files\你的微信号目录。图片主要存放在FileStorage\Image子目录下按日期分文件夹文件缓存可能在FileStorage\File。运行解密工具下载并解压工具直接运行主程序。选择与转换在工具界面中选择包含.dat文件的源目录例如...\Image\2024-05。选择输出目录建议新建一个空文件夹。点击“解码”或“开始”按钮。查看结果工具会自动遍历所有子文件夹中的.dat文件尝试用不同的密钥解密并通过文件头签名判断类型最后以正确的格式.jpg等保存到输出目录。实操心得与避坑指南版本兼容性确保下载的工具是较新的版本以兼容最新版微信生成的文件。老版本工具可能无法识别某些文件。杀毒软件误报由于这类工具会扫描和修改文件部分杀毒软件可能会误报为病毒。使用时可以暂时加入信任区或从信誉良好的开源平台下载。输出目录管理务必使用空文件夹作为输出目录。因为工具可能会生成大量文件混在一起难以管理。同时原始.dat文件务必做好备份以防操作失误。并非100%成功对于损坏的、非标准格式的或加密方式特殊的缓存文件工具可能会解密失败或识别错误。这是正常现象。3.2 方案二Python脚本可定制化如果你有一定编程基础或者需要处理大量文件、集成到自动化流程中Python脚本是绝佳选择。它灵活、透明且可以自己控制每一个细节。核心脚本解析下面是一个基础但功能完整的Python脚本它实现了自动检测密钥、解密并识别文件类型的功能。import os import sys from pathlib import Path def decode_dat_file(dat_path, output_dir): 解密单个微信dat文件 :param dat_path: .dat文件的路径 :param output_dir: 输出目录 with open(dat_path, rb) as f: dat_data bytearray(f.read()) if not dat_data: print(f文件为空: {dat_path}) return # 常见文件类型的魔数文件头 file_signatures { b\xFF\xD8\xFF: jpg, b\x89\x50\x4E\x47: png, b\x47\x49\x46\x38: gif, b\x42\x4D: bmp, b\x25\x50\x44\x46: pdf, # PDF b\x50\x4B\x03\x04: zip, # 也可能是docx等 b\x52\x61\x72\x21: rar, } # 尝试用可能的密钥解密前几个字节进行测试 possible_keys [] for key in range(256): # 遍历所有可能的单字节密钥 (0-255) # 用当前密钥解密前20个字节进行测试 test_bytes bytes([b ^ key for b in dat_data[:20]]) for sig, ext in file_signatures.items(): if test_bytes.startswith(sig): possible_keys.append((key, ext)) break # 找到一个就跳出内层循环 if not possible_keys: print(f无法识别文件类型可能不是图片或常见文档: {dat_path}) # 可以尝试暴力保存为jpg看看因为大部分是图片 key dat_data[0] ^ 0xFF # 假设原文件是JPG decoded_data bytes([b ^ key for b in dat_data]) output_path Path(output_dir) / (Path(dat_path).stem _guess.jpg) with open(output_path, wb) as f: f.write(decoded_data) print(f 已尝试用密钥 {key:#04x} 解密并保存为猜测文件: {output_path}) return # 通常第一个匹配的就是正确的为了保险可以选最长的签名匹配 possible_keys.sort(keylambda x: len(file_signatures.get(bytes([dat_data[0] ^ x[0]]), b)), reverseTrue) key, ext possible_keys[0] # 使用确定的密钥解密整个文件 decoded_data bytes([b ^ key for b in dat_data]) # 生成输出文件名保留原目录结构 rel_path Path(dat_path).relative_to(INPUT_ROOT) if dat_path.startswith(INPUT_ROOT) else Path(dat_path).name output_path Path(output_dir) / rel_path.with_suffix(f.{ext}) output_path.parent.mkdir(parentsTrue, exist_okTrue) with open(output_path, wb) as f: f.write(decoded_data) print(f成功解密: {dat_path} - {output_path} (密钥: {key:#04x}, 类型: {ext})) def batch_decode(input_root, output_root): 批量解密目录下的所有dat文件 input_path Path(input_root) output_path Path(output_root) # 递归查找所有.dat文件 dat_files list(input_path.rglob(*.dat)) print(f找到 {len(dat_files)} 个.dat文件) for i, dat_file in enumerate(dat_files, 1): print(f处理中 [{i}/{len(dat_files)}]: {dat_file}) try: decode_dat_file(str(dat_file), output_root) except Exception as e: print(f处理失败 {dat_file}: {e}) if __name__ __main__: # 配置你的输入和输出目录 INPUT_ROOT rD:\WeChat Files\YourWeChatID\FileStorage # 请修改为你的路径 OUTPUT_ROOT rD:\WeChatDecoded batch_decode(INPUT_ROOT, OUTPUT_ROOT)脚本使用与自定义指南环境准备确保电脑安装了Python 3.x。无需额外库标准库即可运行。修改路径将脚本中的INPUT_ROOT和OUTPUT_ROOT变量替换为你自己的微信缓存目录和期望的输出目录。运行脚本在命令行中执行python wechat_dat_decoder.py。自定义扩展增加文件类型在file_signatures字典中添加新的键值对即可例如b\x49\x44\x33: mp3用于MP3文件。优化密钥检测上述脚本的检测逻辑是基础版。更健壮的实现可以解密更多字节如100字节并与更完整的签名列表进行匹配计算匹配度选择匹配度最高的密钥和类型。并行处理如果文件数量巨大上万可以使用concurrent.futures模块实现多线程/多进程显著提升速度。3.3 方案三在线解密网站临时应急如果你只是偶尔需要查看一两个文件且不想安装任何软件在线工具是一个轻量级的选择。操作流程在搜索引擎中查找“微信dat文件在线解密”或“WeChat dat decoder online”。选择一个看起来可靠的网站注意隐私风险。按照网站指引上传你的.dat文件。网站通常会自动解密并显示图片或提供解密后的文件下载链接。重要风险提示隐私泄露风险你将私密的聊天缓存文件上传到了第三方服务器。服务器端可能留存记录存在隐私泄露隐患。切勿使用此方法处理包含个人敏感信息、证件、合同等内容的文件。文件安全风险恶意网站可能在上传的文件中植入病毒或返回被篡改的文件。功能限制通常有文件大小限制如10MB且不支持批量处理。建议仅将其作为查看无关紧要的、单个缓存文件的最后手段并优先考虑前两种本地化方案。4. 高级应用与深度探索解决了基本查看问题后我们还可以玩出更多花样满足更特定的需求。4.1 批量恢复与整理打造个人媒体库微信缓存图片分散在按月份命名的文件夹中解密后依然杂乱。我们可以用脚本进行后处理。思路扩展按类型分类解密后使用脚本根据文件扩展名将图片.jpg, .png、视频.mp4、文档.pdf, .docx等移动到不同的总目录。按时间重命名从.dat文件的元数据修改时间或从其所在目录名如2024-05中提取时间信息将其加入到输出文件名中例如20240517_143022_xxx.jpg便于排序和查找。相似图片去重使用图像哈希算法如感知哈希pHash计算解密后图片的指纹删除重复的图片节省空间。4.2 集成到自动化工作流对于开发者或运维人员可能需要定期备份或分析这些缓存文件。定时任务在Windows上可以使用任务计划程序在Linux/macOS上使用cron定期如每周日凌晨执行你的Python解密脚本自动将最新的缓存文件解密并归档到指定位置。与云存储同步将解密后的输出目录设置为云盘如OneDrive, Google Drive的同步文件夹实现聊天图片的自动云端备份。内容分析结合OCR光学字符识别库如Tesseract对解密后的图片进行文字识别提取其中的文字信息用于简单的聊天内容分析或信息检索请注意合法合规与隐私边界。4.3 处理特殊与异常情况在实际操作中你可能会遇到一些“顽固分子”。解密后文件损坏可能的原因有1密钥判断错误2文件本身在缓存时已损坏3不是标准的图片/文档格式可能是缩略图或其他二进制数据。应对方法是尝试用其他固定值如0x00,0x89作为假设的明文首字节反推密钥或者用十六进制编辑器手动尝试。新版微信加密变动虽然目前方法通用但未来微信可能会升级加密方式。关注开源社区如GitHub的相关项目动态是获取最新解密方法的最佳途径。如果发现大量新文件无法解密可能就是加密方式变了。非媒体文件的处理语音消息通常存储为.amr或.silk格式的.dat文件需要特定的解码器。这些文件的加密方式可能不同需要寻找专门的语音解密工具或研究其格式。5. 常见问题与排查技巧实录即使掌握了方法和工具实操中仍会踩坑。下面是我在多次处理中积累的问题清单和解决思路。问题现象可能原因排查与解决思路工具运行后无任何文件输出1. 源目录路径错误。2. 输出目录权限不足。3. 工具版本与微信不兼容。1. 检查路径是否包含中文或特殊字符尝试使用纯英文路径。2. 以管理员身份运行工具或换一个具有写权限的输出目录如桌面。3. 尝试使用更新版本的工具或换用Python脚本。解密出的图片无法打开/显示破损1. 解密密钥错误。2. 源.dat文件已损坏。3. 文件类型识别错误如本是视频却存为.jpg。1. 使用十六进制编辑器如HxD打开.dat文件查看前几个字节。尝试用0xFF、0x89、0x47分别异或第一个字节得到多个候选密钥再用脚本小范围测试。2. 找同目录下其他.dat文件测试如果都失败可能是缓存问题。重启微信重新接收图片后再尝试。3. 用文件签名检测工具确认解密后数据的真实格式手动更改扩展名。批量解密时部分文件失败1. 文件中途加密方式有变极少见。2. 文件大小为0或极小。3. 非标准缓存文件如系统文件。1. 查看失败文件的日志单独处理这些文件尝试不同的密钥。2. 忽略大小为0的文件它们是无意义的空缓存。3. 检查文件路径排除Temp、Backup等非缓存目录。Python脚本报编码或路径错误1. 路径字符串包含转义字符如\n。2. 系统语言编码问题。1. 在路径字符串前使用r原始字符串标识符如rC:\Users\...。2. 在脚本开头添加# -*- coding: utf-8 -*-并确保脚本文件本身以UTF-8编码保存。杀毒软件报警或拦截操作此类工具行为类似病毒扫描、修改文件。将工具或脚本所在目录添加到杀毒软件的信任区白名单。从官方GitHub仓库等可信来源下载工具。一条核心经验在处理前务必对整个FileStorage目录进行完整备份。可以将其复制到另一个硬盘或压缩成ZIP包。这样无论后续操作如何失误你都有回滚的余地。最后关于这些技术的使用边界我必须强调所有操作应仅限于恢复个人设备上、属于自己的聊天记录缓存用于数据找回或迁移等合法合规的个人用途。尊重他人隐私和数据安全是底线切勿尝试破解或查看他人的数据文件。技术是一把双刃剑用对了地方是便利用错了地方就是麻烦。希望这篇详尽的指南能帮你把微信留下的这些“数字暗语”变成真正有用的“数据宝藏”。

相关新闻

深入解析mmap内存映射文件:原理、优势与高性能I/O实践

深入解析mmap内存映射文件:原理、优势与高性能I/O实践

1. 项目概述:为什么是mmap? 在程序员的日常开发里,文件读写是再基础不过的操作。无论是读取配置文件、处理日志,还是加载大型资源,我们通常会用 fopen / fread / fwrite 这一套标准I/O库,或者更底层的…

2026/10/14 23:35:12 阅读更多 →
树莓派机器视觉摄像头RPi Camera (M)全解析:从硬件选型到实战应用

树莓派机器视觉摄像头RPi Camera (M)全解析:从硬件选型到实战应用

1. 项目概述:RPi Camera (M) 是什么?如果你手头有一台树莓派,并且动过给它“加上眼睛”的念头,那你大概率已经听说过RPi Camera。但你可能不知道,在官方摄像头模块的家族里,除了最常见的标准版,…

2026/10/15 18:09:12 阅读更多 →
如何高效下载三星固件:Bifrost跨平台免费工具完整指南

如何高效下载三星固件:Bifrost跨平台免费工具完整指南

如何高效下载三星固件:Bifrost跨平台免费工具完整指南 【免费下载链接】Bifrost Cross-platform tool for downloading Samsung mobile device firmware. 项目地址: https://gitcode.com/gh_mirrors/sa/Bifrost 三星设备用户常常面临固件获取的难题——官方渠…

2026/10/15 18:12:25 阅读更多 →

最新新闻

OpenClaw 实战:用 Node.js 与 PowerShell 让 AI 直接操控 Windows 电脑

OpenClaw 实战:用 Node.js 与 PowerShell 让 AI 直接操控 Windows 电脑

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

2026/10/18 14:43:43 阅读更多 →
AI对话即入口:用TaoToken统一通道复现Radisson×Accenture的ChatGPT酒店预订范式

AI对话即入口:用TaoToken统一通道复现Radisson×Accenture的ChatGPT酒店预订范式

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

2026/10/18 14:43:43 阅读更多 →
着急投产建冷库,交付速度为什么要看是不是自有工厂?

着急投产建冷库,交付速度为什么要看是不是自有工厂?

不少客户有工期要求,希望冷库尽快完工投入使用。如果找贸易商,货源依赖外部工厂,订单容易被插队,交货时间很难把控。月宫冷冻拥有自有工厂,可以自主安排生产排产。订单确认后工厂直接安排生产,不受第三方工…

2026/10/18 14:43:43 阅读更多 →
C++语言原理与实践(十三):stack、queue 和 priority_queue的介绍与使用

C++语言原理与实践(十三):stack、queue 和 priority_queue的介绍与使用

本篇目标&#xff1a; 学会stack&#xff0c;queue和priority_queue的接口使用 引子&#xff1a;stack、queue 和 priority_queue 都属于容器适配器。它们不直接负责存储数据&#xff0c;而是在其 他容器的基础上封装出一组特定接口。 #include <stack> #include <…

2026/10/18 14:43:43 阅读更多 →
Spring Boot+Vue法律咨询系统:状态机与事务实践

Spring Boot+Vue法律咨询系统:状态机与事务实践

简介&#xff1a;一份基于Spring Boot与Vue的法律咨询系统完整项目包&#xff0c;面向Java全栈学习者、毕业设计选题学生及律师平台开发者。后端采用Spring Boot 2.7、Spring Security与JWT实现认证授权&#xff0c;结合Redis缓存、WebSocket实时通信、MySQL 8.0存储及阿里云OS…

2026/10/18 14:43:43 阅读更多 →
Linux 进程

Linux 进程

本次内容&#xff1a;1.理解进程概念&#xff0c;了解PCB2.学习进程状态&#xff0c;学会创建进程&#xff0c;掌握僵尸进程和孤儿进程&#xff0c;及其形成原因和危害3.了解进程调度&#xff0c;Linux进程优先级&#xff0c;理解竞争性与独立性&#xff0c;理解并行与并发4.理…

2026/10/18 14:42:42 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 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/18 0:55:02 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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/18 12:16:16 阅读更多 →