news 2026/9/30 6:12:17

Exif与图像取证:从元数据到设备溯源全解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Exif与图像取证:从元数据到设备溯源全解析

做图像取证这些年,我几乎每天都要跟照片的“幕后信息”打交道。很多人只知道打开图片看画面,却不知道每一张JPEG里都藏着一整套拍摄现场记录——这就是Exif(Exchangeable Image File Format,可交换图像文件格式)。在取证场景里,Exif往往是第一个突破口:它直接告诉我们这张照片是什么设备拍的、什么时候按的快门、拍摄时的经纬度是多少,甚至能追出原始文件名和后期软件痕迹。这篇文章就围绕Exif和图像取证这两个核心点,把这块的知识体系、实操细节和排查经验一次讲透。

这篇文章适合三类人:一是刚开始接触数字取证的同行,需要建立对图像元数据的系统认知;二是做舆情分析、原创保护、纠纷举证的运营或法务人员,需要快速判断一张图片是否被篡改、来源是否可信;三是摄影爱好者和后期从业者,想知道自己发出去的照片到底泄露了多少隐私。不管你的目的是哪种,掌握了Exif的读取、解析和异常判断,你就多了一双“透视眼”,能从像素之外的维度看懂一张图。

1. 图像取证中的Exif:它到底是什么,为什么这么重要

1.1 从一次真实排查说起

先讲我处理过的一个典型场景。客户提供了一张截图,说是内部资料泄露的源头。单看画面,只能确认是一张办公室照片,无从判断是哪台设备拍的。我把文件丢进解析工具,双击GPS信息,经纬度直接指向了客户公司的某栋办公楼;再看DateTimeOriginal字段,拍摄时间是晚上十一点十二分,跟门禁记录一比对,当天这个时间段的员工进出记录就浮出来了。整个排查过程,从拿到文件到锁定拍摄位置,用了不到十分钟。

这不是什么玄学,就是Exif的基础用法。相机、手机在保存JPEG时,会按照标准把拍摄参数写进文件头部的元数据区。快门按下的一瞬间,设备型号、镜头参数、光圈快门ISO、时间戳、GPS坐标,甚至设备的唯一序列号,都跟像素一起被存了下来。对取证人员来说,这就是设备自带的供词。

1.2 Exif的存放位置与基本结构

Exif不是一种独立的文件格式,而是建立在JPEG和TIFF之上的一套元数据规范。在JPEG文件中,它以APP1(Application Marker Segment 1)标记段的形式嵌入,跟在SOI(Start of Image)标记之后。简单理解,JPEG文件的物理结构像是“文件头-元数据-图像数据-文件尾”的四层夹心,Exif就夹在最表面的两层之间。

这套标准由日本电子信息技术产业协会(JEITA)制定,目前主流版本是Exif 2.2到2.31,部分新设备已经支持3.0。它内部采用TIFF格式的组织方式来管理字段,核心结构包括:

  • 0th IFD:存放基础信息,比如设备厂商(Make)、型号(Model)、软件(Software)、方向(Orientation)、分辨率等。
  • Exif SubIFD:拍摄参数集中地,包含曝光时间、光圈、ISO、快门速度、镜头信息、原始时间戳(DateTimeOriginal)等。
  • GPSInfo IFD:全球定位数据,包括经纬度、海拔、坐标参考方向等,前提是拍摄时设备定位功能开启。
  • Interoperability IFD:互操作性数据,用于不同设备间的兼容性。
  • 1st IFD:缩略图信息,JPEG内嵌的预览小图也挂在这里。

数据取值以十六进制标签(Tag)形式存储,每个Tag对应一个字段含义。例如0x9003是DateTimeOriginal(拍摄时间),0x8827是ISO感光度,0x0131是Software。取证时,我们通常不会逐个去读十六进制Tag,而是借助工具完成解码,但对结构本身要有数——因为很多篡改行为恰恰发生在对这些IFD的增删改上。

1.3 为什么Exif在取证中被视为“第一线索”

原因有三个。其一,Exif字段自带的信息密度极高。一张照片的Exif可能包含几十个字段,时间、地点、设备、参数、处理软件全都有,相当于把拍摄现场的关键变量一次性打包给你。第二,Exif是设备自动写入的,普通用户没有意识去修改,所以它保留的是“设备视角”的真实记录,而不是“拍摄者主观陈述”。第三,Exif跟图像数据分离存放,即使画面被裁切或压缩,原始元数据往往还残留在文件里,这也是后续做合法性判断的重要依据。

我在初步检查时的习惯顺序是:先确认文件结构完整性,再提取Exif,然后比对系统文件时间、Exif时间和缩略图是否一致。这四步走完,一张图是否被动过手脚、改动发生在哪一层,基本就有数了。

2. 核心术语与字段解析:读懂Exif里的每一行信息

2.1 必须掌握的拍摄参数类字段

字段是Exif的核心资产。取证场景下,我按使用频率把常用字段分了几个梯队,第一梯队是第一时间就要看的:

  • Make / Model(厂商/型号):不解码都能直接读,能快速锁定设备品牌和具体机型。
  • DateTimeOriginal(0x9003):拍摄时间,记录的是按下快门那一刻的本地时间。
  • DateTimeDigitized(0x9004):数字化时间,对于数码原生文件通常和拍摄时间一致;扫描或二次翻拍时两者会出现差异。
  • Software(0x0131):处理软件名称及版本,能间接反映图片是否经过后期、用的什么工具修图。
  • ExposureTime / FNumber / ISOSpeedRatings:曝光铁三角,用于判断拍摄环境和设备性能。
  • FocalLength(0x920A):焦距,结合传感器尺寸可倒推拍摄距离和大致视角。
  • LensModel(0xA434):镜头型号,部分设备还会记录镜头序列号。

第二梯队是进阶定位类字段:

  • GPSLatitude / GPSLongitude / GPSAltitude:经纬度和海拔。存储格式通常是一组GPS坐标值,解码后是标准十进制度。
  • GPSImgDirection(0x9011):拍摄朝向,能辅助判断拍摄者的站位和镜头指向。
  • GPSHPositioningError(0x001F):定位水平误差,用来判断GPS坐标的精度可信度。

第三梯队是容易被忽略但极具价值的字段:

  • OffsetTimeOriginal(0x9011,Exif 2.31):拍摄时间相对UTC的时区偏移。这个字段非常有用,能结合拍摄地推算本地真实时间,也能用来交叉验证设备时区是否被篡改。
  • BodySerialNumber(0xA431或厂商私有):机身序列号。同一台设备拍摄的照片序列号必然一致,这可用于串联多张图片归属同一台设备。
  • MakerNote(厂商私有区):这块区域不遵循公共规范,由各厂商自定义。里面往往藏着快门次数、内部固件版本、电池状态、镜头微调参数等“隐藏供词”。

2.2 与取证强相关的特殊概念

除了字段本身,取证中还有几个概念要提前建立认知。

第一个是“拍摄时间 ≠ 文件修改时间”。Windows资源管理器里显示的“创建时间”“修改时间”,是文件系统层面的时间戳,当文件被复制、移动、重命名、重新保存时都会更新。而DateTimeOriginal是相机固件在编码JPEG时写入元数据的,除非有人专门修过Exif,否则它反映的是真实的曝光时刻。两者结合使用,可以画出一条文件生命周期时间线。

第二个是“设备时区”问题。相机和手机里的日期时间,完全依赖设备本地设置。如果嫌疑人把手机时间改成某年某月某日再拍照,DateTimeOriginal也会跟着变。很多新手会被这个坑绕进去,但恰恰是这个“假的”Exif时间,也会暴露问题——比如照片里的时钟、阴影方向、天气状况与Exif时间对不上。

第三个是“缩略图”的概念。JPEG的第1层IFD里通常带有一张内嵌缩略图,它是相机自动生成的低分辨率预览图,尺寸固定且与主图像内容对应。篡改者经常只改主图不动缩略图,导致两张图内容不一致;反过来,如果缩略图和主图内容完全对不上,基本可以判定文件被二次编辑过。

第四是“EXIF的版本号”。不同版本的Exif支持字段数量和格式不同,比如Exif 2.31才支持OffsetTime字段。识别文件的Exif版本,能辅助判断文件生成的时间范围,也可以用来识别伪造者是否使用了较老的写入工具。

2.3 术语速查表

篇幅有限,我整理了一份最常用的Exif取证术语表,按信息用途做了分类,方便大家直接对照查阅。

术语/字段中文含义取证用途
Make / Model厂商 / 型号设备溯源
DateTimeOriginal拍摄时间时间线重建
DateTimeDigitized数字化时间判断原生/翻拍
OffsetTimeOriginal时区偏移时间与地点交叉验证
GPSLatitude等经纬度位置确认
GPSImgDirection拍摄朝向拍摄者站位分析
Software后期软件篡改检测辅助
FocalLength焦距拍摄距离估算
MakerNote厂商私有区快门次数、内部序列号
BodySerialNumber机身序列号设备串联
Thumbnail缩略图完整性校验
IFD图像文件目录元数据结构解析
APP1标记JPEG元数据段的物理载体文件结构识别

3. 实操实战:提取Exif的完整流程与工具选择

3.1 分析前的准备工作

进入实操前,有两条铁律要先立好。一是取证过程中尽量对原始文件做只读操作,所有分析都基于副本,防止元数据因打开软件自动写入而被破坏。二是记录文件的哈希值(MD5或SHA256),在整个分析流程前后校验一致性,确保后续结论可以复现。

工具方面,我的常用组合分三个梯队:

  • 图形化快速查看:Windows自带的文件属性就有基础Exif信息;更专业一点用ExifTool GUI或FastStone Image Viewer,适合非技术人员快速浏览。
  • 命令行深度解析:ExifTool是目前事实上的行业标准,跨平台、免费、支持读取和写入几百种元数据格式。我百分之九十的元数据提取工作都在它上面完成。
  • 十六进制编辑器:010 Editor、HxD或WinHex。当需要从字节层面分析APP1段结构、检查MakerNote或者在元数据被擦除后手工捞残留信息时,就轮到这一类工具上场。

3.2 ExifTool实战:一条命令看清全部信息

ExifTool是Perl写的开源工具,调用方式极其简单。首先安装,Windows用户直接下载编译好的exe并加入系统PATH即可;Linux和macOS用户用系统包管理器一行命令装好。

基础命令如下:

exiftool photo.jpg

执行后,终端会输出该JPEG的全部元数据。注意输出内容不只包含Exif,还有文件系统的File Size、File Modify Date,以及可能存在的IPTC、XMP、ICC Profile、Photoshop信息等。在取证报告里,我会把输出重定向到文本文件备份:

exiftool -a -u -G1 -s photo.jpg > exif_dump.txt

参数说明:-a显示重复的标签(比如APP1和APP2里可能都有时间字段);-u显示未知标签,一些厂商私有Tag就能露出原形;-G1输出每个字段所在的组名(如Exif、File、Composite);-s使用简短标签名,方便后续批量处理。

只看时间相关字段:

exiftool -time:all -G1 -a -s photo.jpg

只看GPS相关字段:

exiftool -gps:all -G1 -a -s photo.jpg

只看缩略图和叠加信息:

exiftool -thumbnail:all -preview:all -a -s photo.jpg

对于批量文件,直接传入文件夹路径并加-r递归参数可以一次处理整个目录:

exiftool -r -csv /path/to/folder > all_exif.csv

-csv输出CSV表格,后续用Excel或Python分析非常方便。

3.3 从十六进制角度手工验证

虽然ExifTool很强大,但取证工作不能只看工具输出,还要验证文件的物理结构,防止工具被伪造字段误导。用十六进制编辑器打开JPEG,你会看到文件头固定是FF D8(SOI标记),紧接着的FF E1就是APP1段标识,后面跟着APP1段长度,然后是以“Exif\0\0”开头的Exif数据块。

一个标准的Exif头结构大致是:

  • 偏移0:FF D8(SOI)
  • 偏移2:FF E1(APP1标记)
  • 偏移4:两个字节的长度值(含长度自身)
  • 偏移6:45 78 69 66 00 00,即ASCII字符“Exif”加上两个空字节
  • 偏移12:TIFF头,49 49 2A 00(Intel字节序)或4D 4D 00 2A(Motorola字节序)
  • 偏移16+:0th IFD偏移量

我习惯用十六进制工具检查几个关键点:一是APP1段的长度是否与实际字节数一致,二是IFD偏移是否指向合理区域,三是MakerNote是否存在异常的多余字节。如果APP1标称长度与实际数据长度不符,或者IFD偏移指向了一个非Exif区域,这通常意味着有人手工拼接或擦写过元数据。

3.4 Python批量解析与自动化

当需要处理成百上千张图片时,命令行一条条跑就不现实了。我通常写一个Python脚本,封装ExifTool并通过subprocess调用,或者直接用纯Python库Pillow的_getexif()方法解析。Pillow适合快速筛选,但丢字段的情况严重,不能用于正式取证。

更稳的是用exifread库,它能保留更多原始字段,包括GPS定位信息。一段基础的提取代码示例如下:

import exifread with open('photo.jpg', 'rb') as f: tags = exifread.process_file(f) for tag in sorted(tags.keys()): print(f"{tag}: {tags[tag]}")

对于想方便读取GPS和时间的操作,我通常写一个轻量辅助函数,把常见的Exif时间字段统一解析成datetime对象,方便与文件系统时间戳做比较。

from datetime import datetime import exifread def get_datetime_original(filepath): with open(filepath, 'rb') as f: tags = exifread.process_file(f) dt_str = str(tags.get('EXIF DateTimeOriginal', '')) try: return datetime.strptime(dt_str, '%Y:%m:%d %H:%M:%S') except ValueError: return None

4. 图像取证的关键判定:如何利用Exif快速识图溯源

4.1 文件生命周期时间线重建

拿到一张涉案图片,我的第一步永远是画时间线。需要收集的时间点分为三类:文件系统时间戳(创建、修改、访问时间),Exif内部时间字段(DateTimeOriginal、DateTimeDigitized、OffsetTimeOriginal),以及缩略图和叠加信息中可能残留的时间。

一个常见场景:一张图片的文件“修改时间”是2024年7月1日10:00,但Exif拍摄时间是2024年6月20日08:30。如果中间没有转换格式,那文件修改时间等于拍摄时间或晚于拍摄时间都是正常的;但如果文件修改时间早于拍摄时间,那就太反常了——这说明要么是系统时钟被调整过,要么Exif时间被恶意更改了。

我还会仔细检查OffsetTimeOriginal字段,它记录了拍摄时的时区偏移。如果拍摄地在北京(UTC+8)而Exif里写的是UTC+1,说明设备时区设置异常,或有人后期改过。这个字段在Exif 2.31以下版本中不存在,遇到旧格式时可以用GPS时间和时区做交叉验证。

时间线的完整程度直接决定了后续嫌疑人锁定、时序推断等工作的质量,所以在这一步不要偷懒,宁可多花几分钟全面收集,也不要等到分析后期才返工。

4.2 设备溯源与多图串并

Exif中的设备型号、序列号和镜头信息,是把多张图片串到同一台设备上的天然纽带。理论上,即使两张图片的画面毫无关联,只要它们的BodySerialNumber一致,就能确认出自同一台相机或手机。

实操中我遇到过两类情况。一类是拍摄者很谨慎,主动清理了Exif信息,但机身序列号可能残留在MakerNote里;另一类是拍摄者用了“防追踪”类软件批量抹除元数据,结果抹得比预想干净,连缩略图和ICC配置文件都丢了,反而让整张图看起来“过度干净”,引起我的注意。

设备溯源的另一个用法是识别图像源设备类型。手机厂商常把很多私有信息藏在MakerNote里,比如Android手机会记录GPS定位模式、传感器辅助数据;iPhone记录的字段相对收敛,但偶尔会留下一些与相机系统版本相关的痕迹。利用这些信息,可以辅助判断一张图是由手机直出、相机直出,还是经过电脑软件重新编码。

4.3 GPS位置与拍摄场景的交叉验证

GPS字段是Exif里最有实证价值的部分,也是嫌疑方最常动心思擦除的字段。常规做法是直接读出经纬度,然后导入地图确认位置。但更高阶的用法是把GPS与拍摄场景、时间、天气、光线方向联合起来做交叉验证。

举个例子。有一张照片画面显示的是日出时的海景,Exif拍摄时间带的是上午8点。但该地夏天日出时间在6点前,8点太阳高度已经不低,画面光线角度和Exif时间对不上。这时候GPS坐标反而成了证明时间被改的旁证,而不是仅用来定位。

另外,GPS还有一个容易忽略的字段叫GPSHPositioningError,它表示定位的水平误差范围。如果一张照片声称在某地拍摄,但GPS定位误差值远大于画面地理特征可能的偏移范围,那么这张照片的定位可信度就要打个问号。

4.4 软件处理链还原

Exif中的Software字段和History字段(如果有XMP)可以还原图片经历的软件处理链。比如一张图片的Software字段依次是“Adobe Photoshop 25.0(Windows)”和“Pixelmator Pro 3.5”,说明它至少在两个后期软件中周转过。如果嫌疑人在证词中声称图片是相机直出未做任何修改,而Software字段里出现了Photoshop,那这个陈述就不攻自破。

需要注意,Software字段只是“最后一个保存这张图的软件”,它不能证明图被扣过图、调过色。要判断内容是否被篡改,还需要结合错误级别分析(ELA)、压缩痕迹检测、克隆检测等图像取证手段。Exif在这里的意义是提供“行为链条”旁证,它与像素级取证互补,而非替代。

5. 常见问题排查与避坑指南

5.1 为什么图片打开后看不到任何Exif信息

这是最常遇到的情况。原因通常有四种:

  1. 图片来源是社交平台:微信、微博、抖音等平台为了压缩体积和保护隐私,会剥除Exif元数据再重新编码。
  2. 文件经过截图工具处理:Windows截图、macOS截图默认不保留原始Exif。
  3. 相机设置关闭了元数据记录,或手机隐私设置里关闭了“保存位置信息”。
  4. 文件本身不是JPEG而是PNG、WebP等格式,PNG的Exif支持有限,部分WebP文件则完全不写Exif。

排查时,先确认文件格式,再用十六进制查看是否存在APP1段;如果连APP1都没有,说明元数据从一开始就没写入或已被彻底剥离。还要注意一种陷阱:有些工具显示“无Exif”并不代表没有,而是读取器不支持某些编码结构。我通常会用ExifTool跑一遍,如果它也没有输出,才敢下“没有Exif”的结论。

5.2 Exif时间和实际拍摄时间不符的几种可能性

  • 设备时间设置错误:手机和相机的系统时间错了,Exif时间当然跟真实时间对不上。这种情况下无需质疑文件被篡改,需要结合画面内容如日历、时钟、收据、公告牌上的时间辅助判断。
  • 时区设置不同:跨时区拍摄时,如果设备时区设置不正确,Exif时间会偏差数小时。
  • 后期编辑保存:用Lightroom、Photoshop重新保存后,DateTimeOriginal可能保留原值,但文件修改时间已经变了。
  • 恶意篡改:有人故意修改Exif时间,伪造成案发时间点前后的照片。

常规做法是引入多个独立时间维度做交叉比对。我一般会同时看文件系统时间、Exif时间、画面内嵌的可见时间信息以及GPS对应的当地日出日落时间,四个维度至少三个吻合,才认为时间可信。

5.3 图片被压缩过,Exif还能恢复吗

很遗憾,JPEG有损压缩的过程会重写图像数据,但不会自动删除EXIF。问题在于压缩工具是否选择保留元数据。多数平台会主动删除,少数工具会保留但重编码。如果原始文件还在本地,Exif仍有;如果已经上传平台并下载压缩版,那压缩版的Exif基本无法恢复,但压缩痕迹本身也是取证线索,比如可以通过量化表分析判断压缩质量等级和可能使用的软件。

5.4 警惕“Exif信息一致”的错觉

有时候你会遇到两张图片的Exif字段完全一致,比如设备型号、时间、GPS都一样,但不能直接推断它们是连拍或同一设备拍摄。某些后期软件重新保存时会复制前一张图的Exif;还有一些批量重命名、批量打标工具会统一写入固定模板。判断方法就是看物理字节级别的一致性——如果两张不同画面的图片,Exif完整段落的二进制数据完全相同,那就要怀疑是模板写入,而不是设备原生记录。

5.5 实操中的三条小建议

第一,保存原始证据文件,不要直接在原图上分析。每次打开保存操作都可能改变文件哈希,取证结论的说服力会大打折扣。第二,用多个工具交叉验证,ExifTool输出一种结果,Pillow再读一遍,是否一致;字段缺失时检查一下是不是库的解析限制。第三,记录每一步操作,一定要把命令、参数、输出文件都留存,将来出报告或复现时有据可查。

6. 从Exif到完整取证链:元数据之外还需什么

Exif是图像取证的入口,不代表全部。真正严谨的取证流程一定是元数据层面、结构层面和像素层面三层结合。元数据层看Exif、XMP、IPTC、ICC等;结构层看文件格式、DCT量化表、压缩痕迹;像素层看克隆检测、拼接边缘、噪声一致性。

在实践中我发现,Exif最大的价值不只是“直接给出答案”,而是“提出问题”。它告诉你去哪查、查什么、怎么交叉验证。一张Exif正常的照片,内容未必可信;一张Exif被清空的照片,反而可能因为它被过度清理而成为判断篡改的关键线索。

最后再说一个一直想提醒的点:作为取证人员,不要对工具产生依赖感,ExifTool虽然好用,但它只是读数据的管道;真正有价值的是你解读数据的能力。多花时间理解JPEG结构、Exif规范和厂商私有差异,比装一百个一键分析软件有用得多。我在处理早期案件时,就是靠打开十六进制编辑器逐字节翻MakerNote,最终找到了一条ExifTool都未显示的隐藏序列号。那枚序列号成功关联了两张看似毫无关联的照片,把整个案子串了起来。

这个技能听着门槛高,其实不难入门——找几张自己的照片,用工具比较不同相机、手机、修图软件生成的Exif差异,慢慢就会培养出对元数据异常的敏感度。等你闭着眼能说出某张图的Exif对应什么设备行为时,你在图像取证这条路上,就真的入门了。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/30 6:11:36

KEIL-MDK代码格式化指南:用AStyle一键统一代码风格

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

作者头像 李华
网站建设 2026/9/30 6:11:16

PTmalloc、TCmalloc、Jemalloc三大内存分配器对比与选型指南

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

作者头像 李华
网站建设 2026/9/30 6:11:16

Linux 静态库与动态库:链接、加载、符号与排查实战

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

作者头像 李华
网站建设 2026/9/30 6:10:21

基于数据看板的可视化复习:掌握度、遗忘曲线与间隔重复实战

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

作者头像 李华
网站建设 2026/9/30 6:09:58

C语言char/short/int底层原理与跨平台实践

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

作者头像 李华
网站建设 2026/9/30 6:09:05

从BeagleBoard到BeagleV:硬件开源与主线Linux的十八年工程实践

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

作者头像 李华