问题描述
我们经常需要绘制网络报文、内存数据结构等等的示意图。这些示意图,多半是种“表格“结构:
我们需要使用标记语言绘制这种表格(比如,在 Zim 中(总之我们有这种需求))。
该笔记将记录:如何使用 Graphviz 绘制表格,以及整理相关文档。
解决方法
我们这里以绘制在 x86 Protected Mode 下的 GDT 段描述符为例。
如下为绘制”GDT 段描述符表格“的 DOT 代码:
digraph G {
graph [pad="0.5", nodesep="0.5", ranksep="2", fontsize=10];
node [shape=plain, fontsize=10,
fontname="Microsoft YaHei"];
Foo [label=<
<table border="0" cellborder="1" cellspacing="0" cellpadding="2">
<tr>
<td colspan="0" width="10" >00</td>
<td colspan="0">01</td>
<td colspan="0">02</td>
<td colspan="0">03</td>
<td colspan="0">04</td>
<td colspan="0">05</td>
<td colspan="0">06</td>
<td colspan="0">07</td>
<td colspan="0">08</td>
<td colspan="0">09</td>
<td colspan="0">10</td>
<td colspan="0">11</td>
<td colspan="0">12</td>
<td colspan="0">13</td>
<td colspan="0">14</td>
<td colspan="0">15</td>
<td colspan="0">16</td>
<td colspan="0">17</td>
<td colspan="0">18</td>
<td colspan="0">19</td>
<td colspan="0">20</td>
<td colspan="0">21</td>
<td colspan="0">22</td>
<td colspan="0">23</td>
<td colspan="0">24</td>
<td colspan="0">25</td>
<td colspan="0">26</td>
<td colspan="0">27</td>
<td colspan="0">28</td>
<td colspan="0">29</td>
<td colspan="0">30</td>
<td colspan="0">31</td>
</tr>
<tr>
<td colspan="8">Base address (31-24)</td>
<td colspan="1">G</td>
<td colspan="1">D/B</td>
<td colspan="1">L</td>
<td colspan="1">A</td>
<td colspan="4">Segment Limit (19-16)</td>
<td colspan="1">P</td>
<td colspan="2">DPL</td>
<td colspan="1">S</td>
<td colspan="4">Type</td>
<td colspan="8">Base Address (23-16)</td>
</tr>
<tr>
<td port="2" colspan="16">Base Address (15-0)</td>
<td port="2" colspan="16">Segment Limit(15-0)</td>
</tr>
</table>
>];
}
如下是使用该 DOT 代码生成的图片:
已知问题
我们发现:1)我们无法固定格子(Cell)的大小。当文本过长时,格子会变宽(失去比例);2)编写 HTML 也算不上便捷;
针对该问题(绘制这种“字节插图”),我们可以使用 bytefield 处理
相关链接
Graphviz - label attribute
Graphviz (dot) examples
Graphviz: HTML like labels
参考文献
Creating Table Relationship Diagrams with GraphViz
Graphviz (dot) examples
本文档介绍了如何利用Graphviz的DOT语言和bytefield来绘制网络报文、内存数据结构等的表格示意图。通过一个具体的x86ProtectedMode下GDT段描述符的例子,展示了DOT代码的编写,并指出了使用Graphviz时遇到的问题,如单元格大小不可固定。为了解决这些问题,文章推荐使用bytefield进行更方便的‘字节插图’绘制。同时,提供了相关链接供进一步学习。
3万+

被折叠的 条评论
为什么被折叠?



