liert57 downloadsRender concise protocol field definitions as responsive byte and bit structure diagrams.
Protocol Structure Viewer renders binary protocols, packets, and register layouts as responsive byte and bit diagrams in Obsidian. Define a layout with a concise protocol code block—no HTML, SVG, or YAML required.
After the plugin is accepted into the Obsidian Community directory:
main.js, manifest.json, and styles.css from the latest GitHub release.<Vault>/.obsidian/plugins/protocol-structure-viewer/.Add a protocol code block to a Markdown note. Text enclosed in <...> is a placeholder that should be replaced with your own field names and descriptions.
```protocol
@name <Protocol name>
@size 4
@row 16
0x00 | <Header field> | <Header description>
bit 7..4 | <Bit field A> | <Bit field A description>
bit 3..0 | <Bit field B> | <Bit field B description>
0x01..0x02 | <Payload field> | <Payload description>
0x03 | <Checksum field> | <Checksum description>
```
The plugin renders the code block in Reading view. Click a colored field to inspect its range, length, description, and byte or bit subfields.
Protocol Structure Viewer 是一个用于展示二进制协议、数据包和寄存器布局的 Obsidian 插件。用户只需在 protocol 代码块中编写简洁文本,不需要编写 HTML、SVG 或 YAML。
bit 7..0 位域与灵活的 位序(Bit Order)方向配置(MSB-first 高位在前 vs LSB-first 低位在前),满足网络协议与硬件寄存器不同场景。byte 0 / bytes 0..N 相对字节子字段,无需生成多余的 bit 图。[[双链笔记]] 跳转。@variant 模式变体:公共字段只写一次,互斥布局按条件切换。@case 描述查询结果等次级布局;仅在需要时显示第三级路径项。@compact 属性把未使用的协议尾块合并成一行,只保留前几个和后几个字节。@details open/closed 单独控制。插件目录应位于:
<Vault>/.obsidian/plugins/protocol-structure-viewer/
目录中至少需要以下文件:
manifest.json
main.js
styles.css
然后在 Obsidian 的“设置 → 第三方插件”中启用 Protocol Structure Viewer。修改插件文件后,需要重新加载插件或重启 Obsidian;已经打开的笔记可能还需要重新打开,或者切换一次编辑视图和阅读视图。
以下示例中,所有形如 <协议名称>、<字段A>、<条件值A> 的内容均为占位符,使用时请替换为自己的定义。
在 Markdown 笔记中加入:
```protocol
@name <协议名称>
@size 4
@row 16
0x00 | <头字段> | <头字段说明>
bit 7..4 | <位域A> | <位域A说明>
bit 3..0 | <位域B> | <位域B说明>
0x01..0x02 | <数据字段> | <数据字段说明>
bits 0..7 | <子字段A> | <子字段A说明>
bits 8..15 | <子字段B> | <子字段B说明>
0x03 | <校验字段> | <校验范围及算法说明>
```
代码块语言也可以写成 packet-structure:
```packet-structure
0 | <字段A>
1..3 | <字段B>
4 | <字段C>
```
每条字段定义使用三个由 | 分隔的部分:
字节范围 | 字段名称 | 字段说明
字段说明可以省略:
0x00 | <字段A>
0x01..0x03 | <字段B> | <字段B说明>
字段说明原生支持 Markdown 格式(如 **加粗**、行内代码、无序列表、以及 Obsidian 的 [[双链笔记]] 跳转)。
指令以 @ 开头,写法为 @指令 值,不使用冒号。
| 指令 | 别名 | 是否必填 | 说明 |
|---|---|---|---|
@name |
@title |
否 | 协议图标题,默认是“协议结构” |
@size |
无 | 否 | 数据包总字节数;省略时根据最后一个字段自动推断 |
@row |
@columns、@bytes-per-row |
否 | 每行显示的字节数,默认 16(可在设置中修改全局默认值) |
@details |
无 | 否 | 下方“字段说明”是否展开,可选 open 或 closed;省略时使用全局设置 |
@bit-order |
@bitorder、@endian |
否 | 位序方向:msb-first(高位在前)或 lsb-first(低位在前),默认 msb-first |
示例:
@name <协议名称>
@size <总字节数>
@row <每行字节数>
@details open
@bit-order lsb-first
限制:
@size 范围是 1..4096。@row 范围是 1..32。@details 可选值为 open(展开)或 closed(折叠)。@bit-order 可选值为 msb-first(高位在前,别名 msb、big)或 lsb-first(低位在前,别名 lsb、little)。byte、bytes、bit 或 bits 行应紧跟在所属字段下面。单字节字段:
0 | <字段A>
0x1F | <字段B>
连续字节字段:
1..13 | <字段A>
0x0E..0x1A | <字段B>
规则:
@size。0x 的大写十六进制,例如 00、0A、1F。0x01–0x0D。字段按完整字节划分时,使用相对于父字段起点的 byte 或 bytes,不必写成 8-bit 位域:
0x04..0x08 | <父字段> | <父字段说明>
bytes 0 | <子字段A> | <子字段A说明>
bytes 1 | <子字段B> | <子字段B说明>
bytes 2 | <子字段C> | <子字段C说明>
bytes 3 | <子字段D> | <子字段D说明>
bytes 4 | <子字段E> | <子字段E说明>
byte 0 与 bytes 0 等价;范围可写成 bytes 0..2。上例源码中的相对索引 0..4 分别映射到实际协议偏移 0x04..0x08。
规则:
N 字节父字段的有效相对范围是 0..N-1。bit / bits 子字段混用。04 05 06 07 08,不显示 byte 0 · 前缀,也不显示 bit 7..0 标尺。Esc 收起。单字节字段下面使用 bit:
0x00 | <单字节字段> | <单字节字段说明>
bit 7..6 | <位域A> | <位域A说明>
bit 5 | <位域B> | <位域B说明>
bit 4 | <位域C> | <位域C说明>
bit 3..0 | <位域D> | <位域D说明>
规则:
0..7。插件支持配置位序方向,适配不同硬件、通信协议规范(如 CAN、网络报文、各类传感器寄存器):
bit 7 → bit 0。bit 0 → bit 7。配置方式:
@bit-order lsb-first(或 @endian little)。@lsb 或 @msb 修饰符:@bit-order msb-first
# 默认遵循全局 MSB-first (bit 7..0)
0x00 | 标准寄存器
bit 7..4 | 类型
bit 3..0 | 长度
# 覆盖为 LSB-first (bit 0..7)
0x01 | 硬件标志位 @lsb | 该字段按低位优先展示
bit 0..1 | 使能通道
bit 2 | 报警标志
bit 3..7 | 保留
多字节字段下面使用 bits。这里的数字不是物理 bit 编号,而是相对于该字段起点的连续位流位置:
0x01..0x03 | <多字节字段> | <多字节字段说明>
bits 0..9 | <子字段A> | <子字段A说明>
bits 10..17 | <子字段B> | <子字段B说明>
bits 18..23 | <子字段C> | <子字段C说明>
相对位流位置的换算规则:
MSB-first 模式下:
相对字节索引 = floor(position / 8)
物理 bit = 7 - (position % 8)
(相对位置 0 = 首字节 bit 7,相对位置 7 = 首字节 bit 0)
LSB-first 模式下:
相对字节索引 = floor(position / 8)
物理 bit = position % 8
(相对位置 0 = 首字节 bit 0,相对位置 7 = 首字节 bit 7)
规则:
N 字节字段的有效相对范围是 0..(N × 8 - 1)。bits 0..9。@lsb / @msb 独立切换位流的 bit 映射方向。同一协议根据模式字节使用不同布局时,公共字段写在 @variant 之外,每个互斥布局写在独立变体中:
@name <协议名称>
@size 16
@row 16
# 所有模式共有
0x00 | <公共字段A> | <公共字段A说明>
0x01 | <模式标识字段> | <模式标识字段说明>
@variant <模式A>
@when byte[1] == <模式值A>
0x02 | <模式A字段> | <模式A字段说明>
@case <次级布局A>
@when <请求字段> == <条件值A>
0x03..0x05 | <次级布局A字段> | <次级布局A字段说明>
0x06..0x0F | <未使用字段> | <未使用字段说明>
@endcase
@case <次级布局B>
@when <请求字段> == <条件值B>
0x03..0x07 | <次级布局B字段> | <次级布局B字段说明>
0x08..0x0F | <未使用字段> | <未使用字段说明>
@endcase
@endvariant
@variant <模式B>
@when byte[1] == <模式值B>
0x02..0x0F | <模式B字段> | <模式B字段说明>
@endvariant
指令含义:
| 指令 | 说明 |
|---|---|
@variant 名称 |
开始一个互斥布局;名称显示为标题后的模式面包屑 |
@case 名称 |
在当前模式内开始一个次级布局;名称显示为下一级面包屑 |
@when 条件 |
给当前 @case(若存在)或当前 @variant 添加人类可读条件;插件不显示或执行表达式 |
@endcase |
结束当前次级布局,不带参数 |
@endvariant |
结束当前模式,不带参数 |
规则:
@variant 之外的字段是所有模式共有的公共字段。@variant 不能嵌套;@case 只能位于模式内且不能嵌套,因此最多两级。@when 仅用于让未安装插件的读者理解模式条件,不会显示在协议图中,也不会根据实时数据自动切换模式。下面使用占位符展示一个多字节字段包含多个连续子字段的写法:
0x01..0x04 | <多子字段父字段> | <父字段说明>
bits 0..7 | <子字段A> | <子字段A说明>
bits 8..15 | <子字段B> | <子字段B说明>
bits 16..23 | <子字段C> | <子字段C说明>
bits 24..31 | <子字段D> | <子字段D说明>
空行会被忽略。以下两种整行注释都受支持:
# 这是注释
// 这也是注释
说明文字中如果需要使用竖线,写成 \|:
0x00 | <字段名称> | <状态A> \| <状态B>
当前不支持行尾注释;# 和 // 只有位于一行开头时才表示注释。
@row 决定。@compact 是显式显示属性,只能用于结束于协议末尾的一个字段;插件不根据字段名称或说明文字推断。@compact 字段把整个尾块合并为一个正常高度的协议行,字节栏显示开头 3 字节、… 和末尾 3 字节;它仍保留完整范围、点击高亮和字段说明。68rem。Esc 可收起。48rem;过长描述自动换行,超出可视高度时在卡片内部滚动。语法或结构错误会在代码块位置显示红色错误卡片,并尽可能给出行号。常见错误包括:
@size。bit 或 bits 前没有所属字段。@variant 嵌套、未结束、重名或没有字段。@case 位于模式外、嵌套、未结束、重名或没有字段。@when 位于模式外,或在同一个模式/case 内重复定义。@compact 字段,或 @compact 字段没有结束于协议末尾。@ 指令。@name 标题
@size 总字节数
@row 每行字节数
单字节 | 名称 | 可选说明
开始..结束 | 名称 | 可选说明
开始..协议末尾 | 名称 | 可选说明 | @compact
byte 0 | 相对字节子字段名称 | 可选说明
bytes 0..N | 相对字节范围名称 | 可选说明
bit 7..0 | 单字节位域名称 | 可选说明
bits 0..N | 多字节相对位流名称 | 可选说明
@variant 模式名称
@when 人类可读的模式条件
开始..结束 | 模式字段 | 可选说明
@case 次级布局名称
@when 人类可读的次级条件
开始..结束 | 次级布局字段 | 可选说明
@endcase
@endvariant
本项目采用 MIT License。