尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
HexView实战:ECU刷写文件转换、裁剪与CRC校验避坑指南
简介HexViewVectorV1.09.01是一款面向嵌入式开发、软件逆向与数据分析人员的十六进制查看编辑工具解决二进制文件逐字节查看、数据格式转换、搜索替换等底层处理需求。压缩包共19个文件大小仅1.93MB包含主程序exe、功能dll、示例源文件cpp/h、参考手册pdf、配置文件ini、日志log及示例hex等结构紧凑兼顾可直接运行与二次参考。已有4222人学习下载。借助内置转换器可将十六进制与十进制、ASCII等格式互转并支持灵活查找替换随附英文参考手册和示例工程便于快速熟悉界面与接口。对需要排查数据错误、分析代码或验证通信协议的中高级用户这套小型工具包能提升日常二进制处理效率。1. HexView 不是查看器那么简单搞 ECU 刷写的都在用它做文件手术拿到 HexViewVectorV1.09.01很多人第一反应是又一个十六进制查看器。但真正让它在整车刷写和 bootloader 开发里离不开的是它能把烧录文件当手术对象——hex 转 bin、按地址裁剪、合并多 Bank、补 CRC、生成差分补丁全在一个工具里完成。我见过太多人在刷写前用文本编辑器改 hex、在 Excel 里手算校验和然后产线上一片片返工。这篇文章就讲清楚这个工具的核心用法和参数边界让新手能按步骤复现让熟手少踩几个老坑。值得花半小时看完因为后面每一条都能直接省一次产线事故。2. 打开文件到看懂布局HexView 的文件格式模型与界面信息HexView 打开一个文件只是起点真正决定后面转换、裁剪、校验成败的是你有没有读懂这个文件的地址模型。V1.09.01 打开文件后默认走 Autodetect 自动识别格式但自动识别的结果不总是你想要的尤其是当一个工程里同时混着 Intel HEX、S19 和纯 bin 的时候。先花几分钟把格式和界面摸清楚后面所有操作都不会跑偏。2.1 支持格式一览从 Intel HEX 到 S19、bin、ELFHexView 能处理的烧录文件格式按结构可以分成两类自带地址信息的文本格式和裸数据格式。自带地址的典型就是 Intel HEX 和 Motorola S19/S28/S37每一行记录里都写明了数据要放在哪个地址裸数据就是二进制 bin里面只有字节没有任何地址信息地址完全靠你转换时指定的起始地址来定义。格式文件内结构典型用途注意点Intel HEX记录行包含地址、记录类型00/01/04/05 等、数据、行校验通用刷写、UDS 刷写文件地址上限和记录类型决定扩展地址写法S19 / S28 / S37S0 头部、S1-S3 数据记录、S5 计数、S9 结束车规 MCU 刷写、bootloader 配套S1/S2/S3 地址域宽度不同识别错地址就飞BIN纯字节流无地址无校验产线直接按地址刷写转出 hex 时必须手动给基地址TI-TXT逗号分隔的数据段 q 结束符部分 MCU 烧录器段地址在头部容易漏看ELF / COFF编译产物带符号和段属性只读导入、调试比对导出不支持只能导成上面几种打开文件时我一般会扫一眼标题栏或信息窗口里显示的识别结果它说识别成 Intel HEX 还是 S19决定了后面按什么规则解析。很多 S19 地址飞掉的问题根源就是「Autodetect 把 S2 记录当成了 S1 记录」——这种错位在界面上只显示一个地址差异在刷写时直接写到错误地址。提示不要依赖 Autodetect。打开后先在信息窗口确认识别出的格式和地址上限尤其是源文件来自第三方工具链时。2.2 界面模块与信息阅读Address、Data、ASCII、行校验HexView 主窗口的核心是地址-数据对照表默认按 16 字节一行排布。Address 列显示当前行起始地址Data 列按字节显示数据右侧 ASCII 列把可打印字符显示出来最右边还有一个 Checksum 列。很多人把这一列当成文件 CRC这是最常见的误读——它是每一行记录的累加校验只保证这一行没被读坏和 bootloader 要校验的整个文件 CRC 完全是两回事。实际操作里我常干三件事把地址显示切成十六进制默认就是、把每行字节数调到 16、把 ASCII 列打开。切到 ASCII 列后可以肉眼扫一遍文件里有没有版本号、日期、模块名这类字符串用来确认刷写文件是不是期望的那一版。另一个常用技巧是看文件头几个字节对 ARM 内核来说地址 0 处的 4 字节就是初始栈指针接下来 4 字节是复位向量小端序读出来对得上启动地址文件就基本没被裁错。这些阅读能力在排查「文件对了但刷进去不跑」的问题时很值钱。文件打开后先别急着转换看一眼起始地址和复位向量能拦住一半的无效刷写。2.3 用 Address Ranges 检查文件覆盖与空洞View 菜单下的 Address Ranges 窗口会把文件实际占用的地址段列出来每一段的起始地址、结束地址、长度、数据内容一目了然。这是转换前必须做的一步尤其是当你从一个大的完整 flash 镜像里裁 App 区时。我曾经处理过一个 hex看起来只有几十 KB但打开 Address Ranges 才发现里面有一段位于 0x10000000 的配置区——直接从 0 开始转 bin会生成一个从 0 到 0x10000000、大部分是空洞的巨型文件。地址范围内容处理策略0x0000 - 0x7FFFBootloader裁剪时保留或丢弃按目标镜像需求0x8000 - 0xFFFFApp 主程序刷写主体bootloader 跳转目标0x10000000 - 0x10000FFF校准参数区单独处理不参与 App 裁剪空洞的实质是地址区间内没有数据转换时 HexView 会按填充值补齐。了解空洞的位置你才能决定转换时的起始地址和长度填什么。我的习惯是打开文件后先开 Address Ranges截图或记下来再动手转换这一步十秒钟能省掉后面所有「文件怎么这么大」的疑惑。3. 转换与裁剪把 hex 变成 bin 的三条路径与参数选择转换是 HexView 使用频率最高的功能但大多数人只会在 GUI 里点 Save As。实际项目里同一份镜像可能要产出 hex、bin、S19 三种格式分别给刷写工具、产线工装、售后诊断仪用。如果每次都靠手点不仅慢还容易点错参数。这一章把 GUI 转换和命令行转换都讲透参数怎么选、范围怎么填、裁剪和平移的边界在哪一次性说清楚。3.1 GUI 转换与输出格式选择什么时候选 hex、S19、binGUI 转换的路径很直接File 菜单打开源文件再用 Save As 或导出功能选择输出格式。操作上就是四步打开文件、确认识别格式、选输出类型、填地址范围。但真正决定转换质量的不是点击顺序而是后面三个选择。第一输出格式取决于消费方。刷写工具要求 bin就导出 binbootloader 配套引导文件要 S19就导出 S19如果走 UDS 刷写通常保留 Intel HEX 或转成带地址的格式因为协议里要按地址长度组织数据块。第二地址范围要按源文件的实际情况填。Full Range 会把所有地址段都导出适合完整镜像Range 模式需要你填起始地址和长度适合只导出一段。第三字节序一般不动数据本身是什么序就保持什么序HexView 不会也不该帮你翻转字节序。范围填法是新手最容易错的地方。起始地址从哪开始、长度是多少这两个值不是拍脑袋定的。比如一个 App 区从 0x8000 到 0xFFFF长度就是 0x800032768 字节不是 0xFFFF。填错长度导出的 bin 要么多了空洞要么把尾部数据截掉。我一般先在 Address Ranges 里看到段的准确范围再回填到转换对话框保证两边一致。注意Save As 不会删除源文件但输出路径不要直接覆盖源文件尤其是 hex 转 hex 的时候。我曾经覆盖过一次原文件再也找不回来从那以后输出文件名永远带后缀。3.2 命令行转换最小命令与参数解释GUI 适合偶尔用一次但凡是重复劳动我坚决走命令行。HexView 命令行模式的核心是「源文件 输出文件 输入格式 输出格式 范围」参数顺序不敏感但每个参数都对应 GUI 里的一个选项。下面是一个常见的转换命令具体参数名以你手上版本的 Help 为准结构是通用的HexView -s app.hex -o app.bin \ -f intel -t binary \ --start-address 0x8000 --length 0x8000这里-s指定源文件-o指定输出文件-f intel强制把输入按 Intel HEX 解析避免 Autodetect 误判-t binary声明目标格式是 bin--start-address 0x8000和--length 0x8000把裁剪范围锁定在 App 区。执行完看一眼退出码返回 0 才是成功非 0 表示某一步失败需要看控制台输出定位。参数作用示例值注意事项-s源文件路径app.hex路径带空格必须加引号-o输出文件路径app.bin不要和源文件同路径同名-f输入格式intel明确指定别依赖自动识别-t目标格式binary导出 ELF 这类格式是不支持的--start-address起始地址0x8000要和源文件实际地址一致--length数据长度0x8000填错会截断或多出一截空洞命令行转换的价值在于可重复。GUI 里点错一个下拉框可能没感觉命令行把参数写死在脚本里每次执行结果一致出了问题也方便追溯。我第一次把这条命令写进构建脚本时团队刷写返工率直接降了一截。3.3 裁剪与平移只留 App 区或把数据搬到目标地址裁剪是最常见的操作完整镜像里有 bootloader、App、校准参数三块但产线只需要刷 App那就把 App 区间单独导出来。GUI 里在 Save As 时选 Range 模式填 0x8000 起、0x8000 长度命令行就用车上面那条命令本质是一回事。裁剪的要点是先确认源文件里这段地址确实有数据别在空洞上裁剪否则导出的文件开头全是对齐用的空洞。平移Remap则是另一个高风险操作把一段地址的数据搬到另一段地址。比如调试时 App 链接在 0x1000产线镜像要求它在 0x8000有人图省事直接在 HexView 里把数据搬过去。这里必须说清楚HexView 平移只搬数据不修内部指针、不更新中断向量表、不重定位绝对地址引用。你把 0x1000 的数据搬到 0x8000但代码里的向量表、常量地址引用还是按 0x1000 生成的刷进去第一次跳转就死。这是我的血泪经验平移后的文件如果没经过链接器重新链接永远是颗定时炸弹。正确做法是回到编译工程把链接脚本的起始地址改成目标地址重新编译产出新 hex再交给 HexView 做格式转换和校验HexView 只负责格式和范围不负责重定位。理解这条边界能帮你避开「用 HexView 硬搬地址」这个大坑。4. 校验和与 CRC刷写前加签的完整配置与验证bootloader 刷写前要校验镜像完整性这是行业标配算法和参数却五花八门。HexView 内置了从简单累加到 CRC32 再到自定义多项式的校验能力配置界面并不复杂但「算法选型、覆盖范围、结果存放地址、字节序」四个问题个个都有坑。这一章从算法选择讲起把参数逐项拆开最后用一个独立脚本验证 HexView 生成的 CRC确保进产线的是可信产物。4.1 校验算法选型Checksum、CRC16、CRC32 还是自定义选算法不是看哪个高级而是看 bootloader 那边实现了什么。两边算法不一致镜像刷进去第一秒就被校验逻辑拒掉这属于低级事故但真不少见。常见的算法就几类简单累加 Checksum 计算最快但检错能力弱适合对安全性要求不高的场景CRC16 有 CCITT、MODBUS 等变体参数差异大得逐个对齐CRC32 最常用的是 IEEE 802.3 标准的那个检错能力强覆盖绝大多数刷写场景。算法计算方式适用场景对齐难度Sum / Checksum字节或字累加取低 16/32 位快速自检、非安全关键区低CRC16 / CCITT16 位多项式移位计算小镜像、旧协议中变体多CRC16 / MODBUS查表或位运算初值 0xFFFF工业现场总线配套中CRC32 / IEEE 802.3多项式 0x04C11DB7初值全 1bootloader 镜像校验中高自定义多项式多项式、初值、反转都可配私有协议高必须逐项对齐选型的第一步永远不是打开 HexView而是读 bootloader 源码里的校验函数把它的多项式、初值、输入反转、输出反转、异或值抄下来再去 HexView 里填。代码在手谁都不用猜。某次我偷懒没核对默认选了标准 CRC32结果 bootloader 里是 MODBUS CRC16整个产线刷了一上午才被发现从那以后我养成了先读代码再配参数的习惯。4.2 CRC 参数设置初值、多项式、反转、异或与覆盖范围的六个坑HexView 生成 CRC 时你面对的不只是一个算法下拉框还有一组底层参数。这组参数里最常出错的是六个多项式、初值、输入反转、输出反转、异或输出、覆盖范围。前五个定义了「这个 CRC 怎么算」覆盖范围定义了「哪些字节参与计算」两者缺一不可。参数常见值含义容易踩的坑多项式0x04C11DB7CRC 生成多项式和 bootloader 写的不一致初值0xFFFFFFFF计算起始寄存器值默认值不等于 bootloader 用的值输入反转True每个字节位序反转反转状态不同结果完全不同输出反转True计算结果位序反转常和输入反转一起错异或输出0xFFFFFFFF结果再做一次异或部分实现不设这一步覆盖范围0x0000-0xFFFF参与计算的地址区间是否包含校验值本身覆盖范围是真正的重灾区。常见做法是「除了校验值存放的 4 字节其他全算」但很多人图省事把整个文件都划进去CRC 结果写回文件后校验值自身的字节也参与了计算bootloader 那边按同样的范围算根本对不上。另一个坑是字节序CRC 结果写进文件的字节序要和目标 MCU 一致小端机写大端bootloader 读出来就是两个数。操作路径上我一般是在 Tools 菜单下找校验和生成入口选算法后依次填多项式、初值、反转选项、异或值再填覆盖范围的起始和结束地址最后指定结果写入地址。写完不要急着关界面切回主窗口看一眼校验值那 4 个字节是不是落在预期位置——这个习惯值回票价。注意覆盖范围的「开始地址」和「结束地址」是闭区间还是开区间各版本处理不一致。V1.09.01 上我按「含头含尾」理解填实际以 Help 为准填完用下一节的独立脚本验证一次最稳妥。4.3 用独立脚本验证 HexView 生成的 CRC而不是信任它HexView 算出来的 CRC 对不对最可靠的办法不是再点一遍 HexView而是用一个完全独立的工具算一遍。我在项目里常用 Python 的 binascii 模块验 CRC32代码很短跑一次就知道结果是否一致import binascii # 读取 HexView 输出的 bin 文件 # 假设校验值写在文件末尾 4 字节前面均为参与计算的数据 with open(app_with_crc.bin, rb) as f: data f.read() body, stored data[:-4], data[-4:] crc binascii.crc32(body) 0xFFFFFFFF print(computed: 0x%08X % crc) print(stored: 0x%08X % int.from_bytes(stored, little)) # 一致则说明 HexView 的覆盖范围设置正确 assert crc int.from_bytes(stored, little), CRC mismatch脚本逻辑很简单把文件按「数据区 校验区」切开单独算数据区的 CRC32再和文件里存储的校验值比。binascii.crc32用的是标准 CRC32多项式、初值、反转、异或都是 IEEE 802.3 那一套正好对应 HexView 里最常用的配置如果你的 bootloader 用的是自定义多项式这个脚本就改成自己实现的查表函数验证思路不变。这段脚本的另一个价值是把「校验」从 HexView 里解放出来。产线工装脚本不依赖 HexView 也能验证镜像刷写前的最后一道关就多了一重保险。我习惯把脚本放进版本库每次改配置后先跑它通了再放行产线。5. HexView 刷写文件处理的避坑指南现象、原因与解决工具用久了坑是固定的几个翻来覆去就那几类。这一章把我遇到过的高频问题按「现象 → 原因 → 解决」写清楚每条都是可以直接对照排查的记录。你能在十分钟内对上号就能省下半天排查时间。5.1 转换出来的 bin 比预期大好几倍内容全是空洞现象一个只有 64KB 数据的 hex转 bin 后变成几百 MB打开一看开头全是 0xFF真数据躲在后半段。原因源文件里有一个高地址段比如 0x10000000 的配置区Full Range 导出时 HexView 从最低地址铺到最高地址中间的空洞全按填充值补齐文件自然巨大。解决转换前先打开 Address Ranges 看真实地址分布用 Range 模式只导出目标段长度填目标区间的实际长度。这条是转换类问题的头号来源遇到「文件大小离谱」先查地址范围十有八九是它。5.2 CRC 怎么都对不上HexView 算的和 bootloader 验的永远差一截现象刷写后 bootloader 报校验失败反复核对多项式、初值、反转都是对的但结果就是不对。原因最常出在覆盖范围上——HexView 的覆盖范围设置把校验值本身也包进去了或者结束地址多算了 1 字节导致参与计算的字节集合和 bootloader 不一致字节序也常一起凑热闹小端写入被 bootloader 按大端读取数值整个反转。解决先确认校验值存放地址是否在覆盖范围之外再看写入字节序和目标 MCU 是否一致最后把覆盖范围缩小到「数据区结束地址」而不是「整个文件结束地址」。用上一节的独立脚本先验证一遍能直接定位是计算问题还是写入问题。5.3 S19 转 hex 后地址全飞了数据和地址对不上现象一个 S19 文件转成 Intel HEX 后打开一看地址从 0xFFFFFFFF 附近开始或者数据段错位。原因Autodetect 把 S224 位地址记录误识别成 S116 位地址地址域宽度判断错解析出来的地址自然不对。解决不要在 Autodetect 状态下直接转换-f 参数或打开对话框里强制指定 Motorola S19再确认记录类型。S19 的 S1/S2/S3 分别对应 16/24/32 位地址转换前看清源文件里记录类型分布高地址段文件用 S2 或 S3别让工具猜。5.4 合并多个文件后整体校验失败单段校验却全过现象单独验 App 段 CRC 是过的合并了 Bootloader、App、校准区之后整体镜像校验失败。原因合并时两个文件在边界处有重叠或空洞。重叠时后者覆盖前者的数据覆盖的那部分字节和各自独立生成时的内容不一致空洞则把填充值写进镜像而 bootloader 认为空洞位置不该有数据或该填另一个值。解决合并前用 Address Ranges 逐个查文件的实际占用区间确认区间不重叠有空洞就明确填充值和填充策略合并后重新生成整体校验不要沿用各段单独算的 CRC。5.5 命令行执行完退出码是 0但输出文件内容不对现象命令行批量转换「成功」了输出文件却只有几十字节或者打开是空文件。原因命令行的日志默认不落盘失败时的关键信息一闪而过更隐蔽的坑是源文件路径没加引号导致参数解析错位以及某个参数在这个版本里被静默忽略。解决先给命令行开日志输出失败时直接看日志再把源文件和输出文件路径全部加引号最后用一个已知正确的迷你 hex 跑一遍命令对比输出长度和地址分布排除参数解析问题。命令行不是黑匣子只是它默认不告诉你它做了什么把日志打开就好了。6. 把 HexView 收进流水线命令行脚本化与产物自检前面五章的内容全部可以折叠进一条脚本。当你在 GUI 里反复点同一组按钮超过三次就该把它固化成脚本了。我这边的做法是把转换、裁剪、CRC 生成写成函数塞进构建流程每次编译完自动产出带校验的刷写文件同时把关键参数写在脚本头注释里防止半年后自己都忘了当初为什么这么填。6.1 一个典型的生产脚本骨架#!/bin/bash # 参数说明 # APP_START App 区起始地址 # APP_LEN App 区长度 # CRC_ADDR CRC 写入地址 APP_START0x8000 APP_LEN0x8000 CRC_ADDR0xFFFC # 1. 裁剪 App 区并转成 bin HexView -s build/app.hex -o out/app.bin \ -f intel -t binary \ --start-address $APP_START --length $APP_LEN # 2. 生成带 CRC 的刷写文件示意参数按实际版本调整 HexView -s out/app.bin -o out/app_crc.bin \ -f binary -t binary \ --crc32 --crc-start $APP_START --crc-len $APP_LEN \ --crc-address $CRC_ADDR # 3. 独立验证 CRC python3 tools/verify_crc.py out/app_crc.bin脚本每一步都是前面章节操作的命令行形态先裁剪再补 CRC最后独立验证。第二行的 CRC 参数只作示意真实参数名以你手头版本的 Help 为准重点是把算法、范围、写入地址固化进脚本而不是每次人工填。第 3 步是关键——用不依赖 HexView 的脚本验证 HexView 的产物两道关过了才允许文件进产线目录。6.2 用产物自检代替肉眼确认才算收尾脚本写完不等于万事大吉还要验一次幂等性同一份输入跑两遍脚本两次输出必须字节级一致。cmp app_crc.bin app_crc_rerun.bin echo identical sha256sum app_crc.bin checksum.txtcmp比对两次构建的产物一致才说明环境变量、时间戳、默认参数没有干扰结果sha256sum给产物留指纹后续每次刷写前都能快速确认文件有没有被动过。我吃过一次亏某次构建脚本里漏了裁剪参数产线刷了带 bootloader 区的完整 bin虽然没出事但排查过程极其折腾。从那以后所有转换参数必须写进脚本头注释产物必须跑幂等校验手机上存了一份后悔药不如把防线前置。希望这套流程能帮到你少走我走过的弯路。本文还有配套的精品资源点击获取
RELATED

相关推荐

Boop 配置完全指南:.env.local 里 15 个关键环境变量一次讲透

Boop 配置完全指南:.env.local 里 15 个关键环境变量一次讲透

人工智能大模型AI AgentAI 应用Agent 记忆工具调用 【免费下载链接】boop-agent iMessage personal agent: choose Claude Agent SDK (Claude Code) or Codex app-server runtime (Codex/ChatGPT), with memory, sub-agents, automations, integrations. 项目地址: …

📅 2026/10/12 15:54:27
从零手写MATLAB直方图均衡化:原理、实现与工程优化

从零手写MATLAB直方图均衡化:原理、实现与工程优化

1. 为什么我要自己写直方图均衡化函数很多人第一次接触图像增强,都是从MATLAB自带的histeq函数开始的。一行代码下去,灰度分布就均匀了,对比度就上来了,效果看起来还不错。但如果你一直停留在调用现成函数的层面,遇到稍…

📅 2026/10/12 15:54:27
Python 解析 AI 代码自动补全的实现方式:从 401/local proxy failed 到 TaoToken 统一 Key 通道

Python 解析 AI 代码自动补全的实现方式:从 401/local proxy failed 到 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/12 15:54:27
MORE NEWS

更多资讯

📰

信贷风控实战:贷款违约预测的端到端Python建模与避坑指南

简介:本资源是一套面向金融从业者与机器学习初学者的贷款违约预测实战项目,聚焦信用风险评估场景,提供从数据清洗、特征工程到多模型训练与预测的完整Python实现。资源共23个文件,包含7个核心Python脚本(如data_analys…

📰

Cloudera Manager单节点部署NODE1安装指南:CDH 6.x集群搭建核心步骤

1. 为什么单节点部署 Cloudera Manager 是集群搭建的关键一步搞过大数据平台的人都知道,CDH 这套东西虽然现在社区版已经不再更新了,但存量项目里用得还是相当多,尤其是那些早年搭建、至今仍在稳定跑着离线任务和实时链路的集群。我接触过的几…

📰

半量工具,双倍效能:ARPO革新大模型强化学习

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

📰

VSCode插件离线下载与安装:用TaoToken统一Key打通内网vsix部署链路

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

📰

Kubernetes 1.18.8 离线部署实战:从拆包到集群扩容

简介:这份资源是 Kubernetes 1.18.8 版本的离线部署工具包,面向需要搭建 k8s 集群的运维工程师、云原生学习者及备考 CKA 的技术人员,可解决内网环境无法拉取镜像、组件安装繁琐的问题。压缩包共 21 个文件,约 610.15MB&#xff0…

📰

ACM/ICPC 北京站网络赛 B Tomb Raider:用二进制枚举解字符串字典序问题

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

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬