EDID 的 128 字节里都写了什么?逐段读懂显示设备的自述
显示识别出问题时,工具往往吐给你一串十六进制就没下文了。这篇不讲排查流程(那部分站内已有专篇),只干一件事:把 EDID 基础块的 128 字节按偏移逐段拆开,说清每一段写的是什么、哪一段真正决定源设备往外送什么信号、哪些值是规范定死的、哪些只是算出来的。
需要总体排查顺序的,直接看 HDMI/EDID 不识别?显示设备识别异常 7 步排查;需要显卡侧与拼接侧怎么配的,看 EDID / 显卡输出与多屏拼接配置。这篇是它们的补充:当你已经把 EDID 读出来了,接下来该怎么读懂它。
先确认长度,长度不对后面全是白读
各类工具导出的 EDID,落到你手上就是一段十六进制文本。排版五花八门:有的按字节用空格分开,有的十六个一行,有的干脆是一长串连续字符,还有的每个字节都带 0x 前缀、字节之间用逗号隔开。这些写法之间没有信息量差别,本站的解析器会先把 0x 前缀、逗号、分号、冒号统统当分隔符去掉,再按两个字符一字节切开——所以某个词块的字符数是奇数,它会直接判为非法输入,因为那意味着中间少了半个字节。
真正要先看的是总字节数。EDID 基础块的长度是固定的 128 字节,一个字节不多一个字节不少。如果读回来不足 128 字节,说明读取过程被截断了,这种情况下去解析任何字段都没有意义,本站解析器会直接拒绝并告诉你当前只有多少字节。如果超过 128 字节,正常情况下总长应当是 128 的整数倍——因为后面跟着的是一个个同样 128 字节的扩展块。总长既大于 128 又不是 128 的整数倍,说明读取中途丢了字节,同样先重读,别急着分析内容。
只看两处就能判断这份数据可不可信
拿到一串合法长度的字节,第一眼不看内容,先看两个地方。
偏移 0 到 7 是固定 header,规范定死为 00 FF FF FF FF FF FF 00。前后各一个 00、中间连着六个 FF——这种组合在一段普通数据里几乎不会自然出现,它的作用就是让读取方一眼确认「我确实读到了一份 EDID,而不是读到了别的东西或者什么都没读到」。这 8 个字节对不上,这就不是一份有效的 EDID 基础块,后面所有偏移都不必再套。
这一步还能顺带分出两类完全不同的故障方向:读回来全是 00 或者全是 FF,说明拿到的根本不是一份 EDID(header 那 8 个字节就对不上),跟「EDID 内容有问题」是两码事;至于这种读数具体由什么造成,本文的资料范围内没有依据;而 header 正确、后面某些字段异常,才是内容本身的问题。这两类的下一步动作不一样,别混着查。
偏移 127 是校验和。规则很简单:这 128 个字节全部相加,对 256 取模应当等于 0。换句话说,第 127 字节本身就是被写来「配平」的那个数——前面 127 个字节加完是多少,它就取那个补数。
要理解校验和能说明什么、不能说明什么。校验和通过,说明这 128 字节里没有能被这条规则发现的读取错误;校验和不通过,说明其中至少有一个字节读错了,但它不告诉你是哪一个。校验和是一个整体判断,没有定位能力。所以校验和不过的时候,与其盯着 dump 一个字节一个字节地猜,不如换条件重读一遍来得快。
8 到 17 字节:这块屏是谁做的、什么时候做的
这一段是设备的身份信息,也是 dump 里最容易读反的一段。
偏移 8 到 9 是厂商 ID,也就是常说的三字母 PnP ID。它的编码方式有点特别:三个字母各占 5 个 bit,一共 15 个 bit,塞进这两个字节里,其中 A 记为 1。所以你在 dump 里直接看这两个字节的十六进制值,是看不出字母的,必须先把 16 位拼起来再按 5 bit 一组拆,每组的数值加上字母表偏移才还原成字母。
偏移 10 到 11 是产品码,偏移 12 到 15 是序列号,这两项都是小端存放——低字节在前。这是最容易出错的地方:直接按 dump 上从左到右的顺序念出来,得到的数和实际值是字节顺序颠倒的。看到产品码和厂商工单上的对不上,先检查是不是这个原因。
偏移 16 是制造周,偏移 17 是制造年,年份存的是「实际年份减去 1990」。所以这个字节的数值加回 1990 才是年份。本站解析器对这两项做了一层保守处理:制造周为 0 或 0xFF 时视为未填写,制造年为 0 时也视为未填写,这种情况下不再往外报日期,避免把填充值当成真实数据展示出来。
18 到 23 字节:版本、接口定义与物理尺寸
偏移 18 是 EDID 版本,偏移 19 是修订号,两个数拼起来就是常见的「1.3」「1.4」这种写法。规范只把这两个字节定义为版本与修订号,至于不同版本之间在能力上有什么差别,本文的资料范围内没有依据,不做展开。
偏移 20 是视频输入定义。这一个字节里挤了三件事:是数字接口还是模拟接口、位深、以及接口类型。它是「这块屏的输入长什么样」,不是「它能显示什么分辨率」——后者在别的段落里。
偏移 21 到 22 是图像尺寸,单位是厘米。注意这是屏体的物理尺寸,和分辨率没有关系:同样的物理尺寸可以对应完全不同的分辨率。由这两个数换算出屏幕英寸数属于几何计算,EDID 里并没有直接写英寸这个字段。偏移 23 是 gamma。
24 到 53 字节:「还支持哪些」的那一大段
这一段描述的是显示能力,分四块:
| 偏移 | 内容 |
|---|---|
| 24 | 特性支持位 |
| 25–34 | 色度坐标(10 字节) |
| 35–37 | established timings 位图(3 字节) |
| 38–53 | standard timings,8 组,每组 2 字节 |
established timings 用位图方式记录若干早年就标准化下来的时序组合,占 3 个字节;standard timings 是 8 个固定长度的槽位,每个槽位 2 字节,用来放另外一批时序。
读这一段时要抓住一个要点:它回答的是「这台设备还能接受哪些」,不是「它希望你送哪一个」。源设备到底输出什么,取决于下一段里的首选时序,而不是这里的支持列表。所以只盯着这一段,是推不出实际输出格式的——这也是很多人对着 EDID 看半天仍然对不上现场画面的原因。
54 到 125 字节:四个描述符,真正决定输出的那段
这 72 个字节被切成四个 18 字节的描述符,起始偏移依次是 54、72、90、108。
它们的判别规则有点反直觉:同一个位置,可能是一组数字,也可能是一串字符——靠开头两个字节区分。这两个字节是像素时钟:
- 像素时钟非 0 → 这个描述符是详细时序描述符(DTD),里面是一组具体的时序参数;
- 像素时钟为 0 → 它是其它类型,比如显示器名称、序列号字符串、支持的范围限制等等。
所以读 dump 的时候,不要按「第几个描述符固定是什么」去套,必须先看开头两字节。
第一个描述符(偏移 54)是首选时序,也就是这台设备最希望源设备送过来的那一组参数。本站页面下方那个解析器只把这一个描述符解出来:它是「这台设备想要什么」的直接答案,也是最值得拿去和源设备当前输出参数逐项对照的一组数。
DTD 的前 8 字节怎么拆
详细时序描述符一共 18 字节,其中最常用来对照的是前 8 个:
| 偏移 | 内容 |
|---|---|
| 0–1 | 像素时钟,单位 10 kHz,小端 |
| 2 | 水平有效 低 8 位 |
| 3 | 水平消隐 低 8 位 |
| 4 | 高 4 位=水平有效的高 4 位;低 4 位=水平消隐的高 4 位 |
| 5 | 垂直有效 低 8 位 |
| 6 | 垂直消隐 低 8 位 |
| 7 | 高 4 位=垂直有效的高 4 位;低 4 位=垂直消隐的高 4 位 |
这里的设计是为了省字节:有效像素和消隐都可能超过 255,需要 12 位来表示,于是低 8 位各占一个字节,剩下的两个高 4 位合并塞进同一个字节里。拼的时候把那个字节的高 4 位左移 8 位加到水平有效上,低 4 位左移 8 位加到水平消隐上,垂直方向同理。
规范给出的关系是:总数 = 有效 + 消隐,刷新率由像素时钟除以(水平总数 × 垂直总数)推算。所以推算时要用总数,只拿有效像素去算会偏。至于消隐这段时间在信号里具体承担什么,本文的资料范围内没有定义,不做展开。
最后一条很关键:详细时序描述符里没有直接写刷新率的字段。刷新率是用像素时钟除以(水平总数 × 垂直总数)推算出来的。工具上显示的那个 Hz 值是算出来的结果,跟设备菜单上写的标称值出现小数位上的出入,属于正常现象,不是读错了。转述给别人的时候最好说清这一点,免得被当成矛盾数据来回追。
126 字节:扩展块数量,也是最容易被漏掉的一格
偏移 126 写的是基础块后面还跟着几个扩展块,每个扩展块同样是 128 字节。
这一格为 0,说明整份 EDID 就这 128 字节,读完了。这一格不为 0,说明后面还有内容——基础块的四个描述符槽位有限,装不下的内容会外溢到扩展块里。这时如果你的工具只解析了基础块,就会得到一份看起来完整、实际上缺了一大截的结论。先看这一格,再决定要不要往下读,比读完基础块再发现漏了要省事得多。
读 dump 时最容易栽的几个坑
把上面的内容压成一张自检清单:
- 字节序:产品码、序列号、像素时钟都是小端,直接从左往右念会念反。
- header 全
00或全FF:这是「没读到」,不是「读到了但内容坏」,两者的下一步完全不同。 - 校验和只证明读得完整,不证明内容对:一份内容荒唐但校验和配平过的 EDID,同样能通过这项检查。
- 支持列表 ≠ 首选时序:决定源设备输出什么的是偏移 54 那个描述符,不是 established/standard timings 那一段。
- 描述符不能按位置硬套含义:先看它前两字节是不是 0。
- 版本号不是能力:1.4 不代表比 1.3 支持更多分辨率。
- 图像尺寸不是分辨率:那两个字节的单位是厘米。
- 扩展块数不为 0 就还有东西没读。
顺一遍下来,一串原本无从下手的十六进制就能变成几条可以拿去和现场对照的具体结论:这台设备的身份是什么、它首选哪组时序、这份数据是不是完整、后面还有没有内容。至于读出来之后发现分辨率对不上、或者链路上某一级把这份 EDID 改掉了怎么办,那属于排查范畴,看 拼接屏分辨率反复跳变?EDID 没锁住是主因 与 播放器视频输出(显卡/拼接/EDID)科普。
你可以把手上的 EDID 十六进制直接粘到下面的解析器里,对照这篇一段段核。
在线解析你自己的 EDID
解析全程在浏览器本地完成,数据不会离开你的电脑。
EDID 基础块解析
把读到的 EDID 十六进制粘进来,解析在你自己的浏览器里完成,不上传任何数据。 支持空格、换行、0x 前缀混排。
留言讨论
评论发布后会被人工复核,违规内容将被删除。
如果发表没有反应,可以前往联系我们告诉我们。