0x10 前言

SCPI是一个对人或者说用户十分友好的语言,采用了人性化的抽象与对于用户很友善的组成方式。

但是对于某些机器的设计就会很难受,而且当前的机器会在日后的不停更新导致当前的程序越来越呈现一种指数级别的裂变。这种裂变是冗余的、灾难性的,因此需要一个简单的压缩方式或者说压缩算法进行数据的去冗余,提炼出干练的短句。

阅读本文之前,您需要掌握的技能有:

技能名称 技能熟练度 技能教程链接
C语言 熟悉 暂无
数据结构 熟悉 暂无

0x20 简单介绍

这是一个简单的SCPI指令:

A:B:C:D:E

可以看到一个简单的层级结构,A为第一级,一般代表一个大类。B为一个中间点,是一个主要的选项,C、D、E为当前的选择支类,他们可能并不是很重要,但是可能很多指令存在。

这些指令也有可能是可隐藏的,比如:

[A:]B:C[:D]:E

这种指令下,B:C:EA:B:C:D:EA:B:C:EB:C:D:E都是对的,只要保证[]以外的全部都有即可。

而一般的指令都会有两个格式,写入与获取。

写入就是很简单的加参数,读取更简单,一般直接在指令后加上?即可。

所以一个标准的指令一般有两类:

  1. 加参数的写入指令
  2. 加?的读取指令,有的指令会加参数读取。

0x30 基本思想

可以看到,这边的指令具有明显的冗余位置:

当前的指令必定会有读取和写入,而他们大概率是长得一样的,这种压缩就取决于当前是否需要了,这里仅讲述个人认为较为简单的压缩思想:去重查找。

去重的核心就是找到重复的数据。然后把当前的数据使用特殊的方式映射到表中,随后可以在需要的地方进行还原。

这里因为单板的计算能力有限,所以笔者使用了较简单的查表法进行还原,但是采样的方式较为麻烦。

0x40 查重

当前的数据存在及其严重的数据冗余,这里使用很简单的比对方式:主要步骤为数据截取、数据比对、数据连接。

笔者这里选择的是双向链表的形式,一方面是锻炼自己的数据操作能力与数据架构能力,一方面也是根据当前不定长度与不定个数的数据结构的较为简单的生成。

这里的数据仅仅需要可用的数据,也就是忽略了一切标点符号的连续字符。每段字符串都是一节可用的数据。并且为了单板的拼接方便,这里还使用了数据ID的标记针对当前的字符串做出专有的定义。这样在最后只需要生成以ID从小到大排列的顺序生成一个数组即可,这样就可以直接根据ID拼接数组形成最后的指令。

根据上面的要求就可以得到一个明确的基本数据结构:

typedef struct
{unsigned int ID;char* String;}

这个数据还缺了上下的链表,于是需要这样:

typedef struct S_STRING
{struct S_STRING* prev;struct S_STRING* next;unsigned int ID;char* String;   }S_STRING_NODE;

这个就是一个基本的双向链表,传输的指针也不需要必须要是特定的字符串,只需要一个数据的指针即可。所以还需要一个当前的数据长度的指示位。

typedef struct S_STRING
{struct S_STRING* prev;struct S_STRING* next;unsigned int ID;char* String;  unsigned int length;}S_STRING_NODE;

这就是一个节点。

有了一个节点,就可以向里面填充数据。数据的结构虽然是严格意义上的双向,但是还是需要一个头作为笔者编程时调试的锚点。也好判断当前的数据结构是否正确。于是笔者定义了一个作为锚点的根数据,随后的数据全都是衔尾蛇一般的双向数据链表。

假设输入的数据是这样子的

SYSTem:REMote
SYSTem:RWLock
SYSTem:GreenDream

这里数据最后的输出结果就是:

#mermaid-svg-GxxHYekUzREmgdz9 .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-GxxHYekUzREmgdz9 .label text{fill:#333}#mermaid-svg-GxxHYekUzREmgdz9 .node rect,#mermaid-svg-GxxHYekUzREmgdz9 .node circle,#mermaid-svg-GxxHYekUzREmgdz9 .node ellipse,#mermaid-svg-GxxHYekUzREmgdz9 .node polygon,#mermaid-svg-GxxHYekUzREmgdz9 .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-GxxHYekUzREmgdz9 .node .label{text-align:center;fill:#333}#mermaid-svg-GxxHYekUzREmgdz9 .node.clickable{cursor:pointer}#mermaid-svg-GxxHYekUzREmgdz9 .arrowheadPath{fill:#333}#mermaid-svg-GxxHYekUzREmgdz9 .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-GxxHYekUzREmgdz9 .flowchart-link{stroke:#333;fill:none}#mermaid-svg-GxxHYekUzREmgdz9 .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-GxxHYekUzREmgdz9 .edgeLabel rect{opacity:0.9}#mermaid-svg-GxxHYekUzREmgdz9 .edgeLabel span{color:#333}#mermaid-svg-GxxHYekUzREmgdz9 .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-GxxHYekUzREmgdz9 .cluster text{fill:#333}#mermaid-svg-GxxHYekUzREmgdz9 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-GxxHYekUzREmgdz9 .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-GxxHYekUzREmgdz9 text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-GxxHYekUzREmgdz9 .actor-line{stroke:grey}#mermaid-svg-GxxHYekUzREmgdz9 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-GxxHYekUzREmgdz9 .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-GxxHYekUzREmgdz9 #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-GxxHYekUzREmgdz9 .sequenceNumber{fill:#fff}#mermaid-svg-GxxHYekUzREmgdz9 #sequencenumber{fill:#333}#mermaid-svg-GxxHYekUzREmgdz9 #crosshead path{fill:#333;stroke:#333}#mermaid-svg-GxxHYekUzREmgdz9 .messageText{fill:#333;stroke:#333}#mermaid-svg-GxxHYekUzREmgdz9 .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-GxxHYekUzREmgdz9 .labelText,#mermaid-svg-GxxHYekUzREmgdz9 .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-GxxHYekUzREmgdz9 .loopText,#mermaid-svg-GxxHYekUzREmgdz9 .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-GxxHYekUzREmgdz9 .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-GxxHYekUzREmgdz9 .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-GxxHYekUzREmgdz9 .noteText,#mermaid-svg-GxxHYekUzREmgdz9 .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-GxxHYekUzREmgdz9 .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-GxxHYekUzREmgdz9 .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-GxxHYekUzREmgdz9 .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-GxxHYekUzREmgdz9 .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-GxxHYekUzREmgdz9 .section{stroke:none;opacity:0.2}#mermaid-svg-GxxHYekUzREmgdz9 .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-GxxHYekUzREmgdz9 .section2{fill:#fff400}#mermaid-svg-GxxHYekUzREmgdz9 .section1,#mermaid-svg-GxxHYekUzREmgdz9 .section3{fill:#fff;opacity:0.2}#mermaid-svg-GxxHYekUzREmgdz9 .sectionTitle0{fill:#333}#mermaid-svg-GxxHYekUzREmgdz9 .sectionTitle1{fill:#333}#mermaid-svg-GxxHYekUzREmgdz9 .sectionTitle2{fill:#333}#mermaid-svg-GxxHYekUzREmgdz9 .sectionTitle3{fill:#333}#mermaid-svg-GxxHYekUzREmgdz9 .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-GxxHYekUzREmgdz9 .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-GxxHYekUzREmgdz9 .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-GxxHYekUzREmgdz9 .grid path{stroke-width:0}#mermaid-svg-GxxHYekUzREmgdz9 .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-GxxHYekUzREmgdz9 .task{stroke-width:2}#mermaid-svg-GxxHYekUzREmgdz9 .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-GxxHYekUzREmgdz9 .taskText:not([font-size]){font-size:11px}#mermaid-svg-GxxHYekUzREmgdz9 .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-GxxHYekUzREmgdz9 .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-GxxHYekUzREmgdz9 .task.clickable{cursor:pointer}#mermaid-svg-GxxHYekUzREmgdz9 .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-GxxHYekUzREmgdz9 .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-GxxHYekUzREmgdz9 .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-GxxHYekUzREmgdz9 .taskText0,#mermaid-svg-GxxHYekUzREmgdz9 .taskText1,#mermaid-svg-GxxHYekUzREmgdz9 .taskText2,#mermaid-svg-GxxHYekUzREmgdz9 .taskText3{fill:#fff}#mermaid-svg-GxxHYekUzREmgdz9 .task0,#mermaid-svg-GxxHYekUzREmgdz9 .task1,#mermaid-svg-GxxHYekUzREmgdz9 .task2,#mermaid-svg-GxxHYekUzREmgdz9 .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-GxxHYekUzREmgdz9 .taskTextOutside0,#mermaid-svg-GxxHYekUzREmgdz9 .taskTextOutside2{fill:#000}#mermaid-svg-GxxHYekUzREmgdz9 .taskTextOutside1,#mermaid-svg-GxxHYekUzREmgdz9 .taskTextOutside3{fill:#000}#mermaid-svg-GxxHYekUzREmgdz9 .active0,#mermaid-svg-GxxHYekUzREmgdz9 .active1,#mermaid-svg-GxxHYekUzREmgdz9 .active2,#mermaid-svg-GxxHYekUzREmgdz9 .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-GxxHYekUzREmgdz9 .activeText0,#mermaid-svg-GxxHYekUzREmgdz9 .activeText1,#mermaid-svg-GxxHYekUzREmgdz9 .activeText2,#mermaid-svg-GxxHYekUzREmgdz9 .activeText3{fill:#000 !important}#mermaid-svg-GxxHYekUzREmgdz9 .done0,#mermaid-svg-GxxHYekUzREmgdz9 .done1,#mermaid-svg-GxxHYekUzREmgdz9 .done2,#mermaid-svg-GxxHYekUzREmgdz9 .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-GxxHYekUzREmgdz9 .doneText0,#mermaid-svg-GxxHYekUzREmgdz9 .doneText1,#mermaid-svg-GxxHYekUzREmgdz9 .doneText2,#mermaid-svg-GxxHYekUzREmgdz9 .doneText3{fill:#000 !important}#mermaid-svg-GxxHYekUzREmgdz9 .crit0,#mermaid-svg-GxxHYekUzREmgdz9 .crit1,#mermaid-svg-GxxHYekUzREmgdz9 .crit2,#mermaid-svg-GxxHYekUzREmgdz9 .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-GxxHYekUzREmgdz9 .activeCrit0,#mermaid-svg-GxxHYekUzREmgdz9 .activeCrit1,#mermaid-svg-GxxHYekUzREmgdz9 .activeCrit2,#mermaid-svg-GxxHYekUzREmgdz9 .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-GxxHYekUzREmgdz9 .doneCrit0,#mermaid-svg-GxxHYekUzREmgdz9 .doneCrit1,#mermaid-svg-GxxHYekUzREmgdz9 .doneCrit2,#mermaid-svg-GxxHYekUzREmgdz9 .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-GxxHYekUzREmgdz9 .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-GxxHYekUzREmgdz9 .milestoneText{font-style:italic}#mermaid-svg-GxxHYekUzREmgdz9 .doneCritText0,#mermaid-svg-GxxHYekUzREmgdz9 .doneCritText1,#mermaid-svg-GxxHYekUzREmgdz9 .doneCritText2,#mermaid-svg-GxxHYekUzREmgdz9 .doneCritText3{fill:#000 !important}#mermaid-svg-GxxHYekUzREmgdz9 .activeCritText0,#mermaid-svg-GxxHYekUzREmgdz9 .activeCritText1,#mermaid-svg-GxxHYekUzREmgdz9 .activeCritText2,#mermaid-svg-GxxHYekUzREmgdz9 .activeCritText3{fill:#000 !important}#mermaid-svg-GxxHYekUzREmgdz9 .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-GxxHYekUzREmgdz9 g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-GxxHYekUzREmgdz9 g.classGroup text .title{font-weight:bolder}#mermaid-svg-GxxHYekUzREmgdz9 g.clickable{cursor:pointer}#mermaid-svg-GxxHYekUzREmgdz9 g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-GxxHYekUzREmgdz9 g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-GxxHYekUzREmgdz9 .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-GxxHYekUzREmgdz9 .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-GxxHYekUzREmgdz9 .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-GxxHYekUzREmgdz9 .dashed-line{stroke-dasharray:3}#mermaid-svg-GxxHYekUzREmgdz9 #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-GxxHYekUzREmgdz9 #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-GxxHYekUzREmgdz9 #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-GxxHYekUzREmgdz9 #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-GxxHYekUzREmgdz9 #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-GxxHYekUzREmgdz9 #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-GxxHYekUzREmgdz9 #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-GxxHYekUzREmgdz9 #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-GxxHYekUzREmgdz9 .commit-id,#mermaid-svg-GxxHYekUzREmgdz9 .commit-msg,#mermaid-svg-GxxHYekUzREmgdz9 .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-GxxHYekUzREmgdz9 .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-GxxHYekUzREmgdz9 .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-GxxHYekUzREmgdz9 g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-GxxHYekUzREmgdz9 g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-GxxHYekUzREmgdz9 g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-GxxHYekUzREmgdz9 g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-GxxHYekUzREmgdz9 g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-GxxHYekUzREmgdz9 g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-GxxHYekUzREmgdz9 .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-GxxHYekUzREmgdz9 .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-GxxHYekUzREmgdz9 .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-GxxHYekUzREmgdz9 .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-GxxHYekUzREmgdz9 .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-GxxHYekUzREmgdz9 .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-GxxHYekUzREmgdz9 .edgeLabel text{fill:#333}#mermaid-svg-GxxHYekUzREmgdz9 .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-GxxHYekUzREmgdz9 .node circle.state-start{fill:black;stroke:black}#mermaid-svg-GxxHYekUzREmgdz9 .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-GxxHYekUzREmgdz9 #statediagram-barbEnd{fill:#9370db}#mermaid-svg-GxxHYekUzREmgdz9 .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-GxxHYekUzREmgdz9 .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-GxxHYekUzREmgdz9 .statediagram-state .divider{stroke:#9370db}#mermaid-svg-GxxHYekUzREmgdz9 .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-GxxHYekUzREmgdz9 .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-GxxHYekUzREmgdz9 .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-GxxHYekUzREmgdz9 .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-GxxHYekUzREmgdz9 .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-GxxHYekUzREmgdz9 .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-GxxHYekUzREmgdz9 .note-edge{stroke-dasharray:5}#mermaid-svg-GxxHYekUzREmgdz9 .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-GxxHYekUzREmgdz9 .error-icon{fill:#522}#mermaid-svg-GxxHYekUzREmgdz9 .error-text{fill:#522;stroke:#522}#mermaid-svg-GxxHYekUzREmgdz9 .edge-thickness-normal{stroke-width:2px}#mermaid-svg-GxxHYekUzREmgdz9 .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-GxxHYekUzREmgdz9 .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-GxxHYekUzREmgdz9 .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-GxxHYekUzREmgdz9 .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-GxxHYekUzREmgdz9 .marker{fill:#333}#mermaid-svg-GxxHYekUzREmgdz9 .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}#mermaid-svg-GxxHYekUzREmgdz9 {color: rgba(0, 0, 0, 0.75);font: ;}GreenDreamSYSTemREMoteRWLockROOT

这个样子。(这个图已经是笔者能够找到的最好用的图片了)

这样就会将原本46字符(算上占位符)的字符减小变成约32个字符。压缩了大约70%。

随着数据越加越多,对于原本的数据压缩甚至可以做到10%(笔者试验了某功能较多的机器,各类指令约有800条,原指令约为22k,压缩完成后的数据约为2.2~2.5K)

就其根本是因为这种层级指令组合本身就不适合使用简单粗暴的方式进行数据检索。更应该是使用类似字典查表法进行依次比对。

0x50 二次映射

前文为了降低阅读量(笔者最近太忙以至于并没时间写关于SCPI的构成),就省略了SCPI中,指令的基本构成法则。

下面介绍下基本的构成规则:

  1. 指令主要分为必须要的指令、可省略的指令。
  2. 指令方向有设置与读取。
  3. 指令层级以:结尾。

于是出现了四种构成指令层级的方式:?[::]:

而具体的指令格式则为当前需要的要求组成,就像上文那样的组成即可。

现在已经有了一个完整的数据去重的链表。下面需要做的就是把这个链表做映射,并将映射的数据导出。

导出的前提是有一个结构化的表格类似的数据结构。笔者自己做了一个类似于Hash Table的数据结构,总体的格式类似于思维导图的形式。

可以看出来,总体是一个{形式的一个数据结构。因此也就出现了两个必须要解决的问题:数据格式的定义,数据格式的拼接。

可以看到,这两个问题属于一个问题:如何优雅的利用数据的解析形式,完成对于整个映射的构造。

上图可以看到,整个数据结构有三类节点:根节点、指令头部节点、跟随的后续指令节点

根节点仅具备区域边界的指向性,也就是说只负责指定当前数据结构的区间的第一个数据与最后一个数据。从而使得整个指令头部形成一个衔尾蛇的循环结构。而所有的指令头部节点全部都会指向根节点,以保证当前节点可以迅速回到根,从而进入其他的节点。从图片上可以看出,头部节点具有四个方向,而整体的数据构成了两个双向链表与一个循环结构。也就是说当前的节点需要四个指针向量。

typedef struct S_1
{struct S_1* prev;struct S_1* next;struct S_1* supper;struct S_1* child;}S_S;

这就是两个指针表示前后,两个指针表示上下。随后就需要ID了。

typedef struct S_1
{struct S_1* prev;struct S_1* next;struct S_1* supper;struct S_1* child;unsigned int Id;}S_S;

这个时候还少了最关键的指令的层级表示。也就是对于字符串的?[::]:
因为只有四个状态,正好就是两个比特位。这样就可以得到一个数据了。
考虑到北京大学图书馆-牛津词典检索的记录单词的个数,一般来说20比特的数据就可以直接得到几乎全部的英语单词量了。但是一般人都不会用这么多的单词构架指令数。所以当前的数据结构暂时可以只使用32比特的数据定义,其中前拆出2位数据作为层级表示的定义,剩下的作为检索的ID使用。


typedef enum
{NORMAL,LEFT,RIGHT,RETURN
}E_S;typedef union
{E_S special:2;unsigned id:14;
}U_Stypedef struct S_1
{struct S_1* prev;struct S_1* next;struct S_1* supper;struct S_1* child;U_S Point;}S_S;

这样就形成了一个基本的数据结构。
笔者的能力有限,也只有结合当前的结构,在某些情况下选择性的更新某些数据指针。例如

  1. 在根节点中,上下分别指向根节点和空闲。而前后分别指向第一个和最后一个节点。
  2. 头部节点中,上下则指向根节点与跟随节点,左右分别指向相对于现在的先后添加的头部节点。
  3. 而跟随节点仅包含前后结构,最前面的跟随节点指向头部与随后的跟随节点
  4. 后面的跟随节点则前后都是跟随节点。

总体上的组合就是这样组合,虽然实际上拥有四个层级,但是数学告诉人们,只需要三道横线就可以画出四个区域。

0x60 组合对比

笔者对当前的压缩方式计算了一下,对于选择的样本:860个指令,一个真实的机器指令集,约22000字符。

压缩前字符22000,约为20k。

压缩后的的单词约为270个,仅占用有效9位有效ID字节。而所有的单词占用的字符约为2000,也就是2k。

经过映射的数据节点约为3800个,每个数据节点的有效数据约为2byte,也就是约为7kb。

随后需要合成的临时数据空间暂时定义为300b,这个区间足可以定义绝大多数的指令。而且仅占用RAM不会占用ROM。可以随时动态申请。

也就是大约需要10KB的实际占用空间。也就压缩了约50%的实际空间。

当然,如果能够再利用一个字节将读取与写入的指令绑定会得到更大的压缩效率(保守估计约为80%左右),但是对于解析器的要求很大,必须要在解析器构建之前就进行一定的前置适配。

以上。

更多

本文首发自 记: 对于SCPI指令以及相同类型指令解析器的指令压缩方式,更多文章可进入我的博客详查。

记: 对于SCPI指令以及相同类型指令解析器的指令压缩方式相关推荐

  1. 解读乐鑫 AT 指令解析器,解锁你不知道的用法

    文章首发于 『物联网学前班』公众号,欢迎关注.星标获取即时信息. 由于近期正好在做这个事情,所以今天就以乐鑫的 AT 指令为例,讲讲 AT 解析器设计有哪些事情,也算是个自己近期的学习总结了. 往期文 ...

  2. linux type命令(用来显示指定命令的类型,判断给出的指令是内部指令还是外部指令,如果给出的指令为外部指令,则显示其绝对路径)

    文章目录 type 补充说明 语法 选项 参数 实例 type 显示指定命令的类型 补充说明 type命令 用来显示指定命令的类型,判断给出的指令是内部指令还是外部指令. 命令类型: alias:别名 ...

  3. 找不到类型{0} 它在 ServiceHost 指令中提供为 Service 特性值

    由于我把binding改成wsHttpBinding,在web.config里也改了命名空间 services的类名也改成了跟 web.config对应的命名空间后 在添加引用后,出现了错误: &qu ...

  4. 【汇编语言】理解8086CPU中,不同类型的寄存器和汇编指令规则的联系(会继续更新)

    0 前言 你是否因为汇编指令繁杂的规则而苦恼呢?作者本人也很烦,因为往往教材中只告诉我们规则,却不告诉我们为什么,没有原因就直接记忆,负担太大,后期灵活运用也增添阻力,因此,我经过自己的思考去为你解释 ...

  5. 【重难点】【Java基础 07】变量类型、内部类、处理器指令优化

    [重难点][Java基础 07]变量类型.内部类.处理器指令优化 文章目录 [重难点][Java基础 07]变量类型.内部类.处理器指令优化 一.变量类型 1.对比 二.内部类 1.介绍 三.处理器指 ...

  6. FANUC机器人动作指令的定位类型FINE和CNT详解

    FANUC机器人动作指令的定位类型FINE和CNT详解 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到网站. FANUC机器人的定位类型,即定义动作指令中 ...

  7. mov 指令用c语言写,汇编总结:mov指令

    mov指令的作用: mov指令可能是汇编里用的最多的指令了,完成c语言里的赋值. mov指令种类: 1.普通的mov指令 2.做符号扩展的movs 3.做零扩展的movz 1.普通mov的种类有: m ...

  8. 信捷plc c 语言全局变量,三菱PLC编程中,跳转指令CJ、子程序调用CALL和中断指令有什么区别?...

    满意答案 0519gao 2013.10.06 采纳率:46%    等级:12 已帮助:11303人 子程序帮助您对程序进行分块.主程序中使用的指令决定具体子程序的执行状况.当主程序调用子程序并执行 ...

  9. mc服务器常用指令_我的世界服务器指令大全 史上最全的服务器指令介绍

    我的世界服务器指令大全 史上最全的服务器指令介绍.那大家也知道在我的世界中有许许多多的指令,有的是单机的有的是手机的也有的是服务器的,那今天给大家介绍的是服务器的指令,那下面一起来看看在服务器里面都有 ...

最新文章

  1. 正则表达式限定长度_自己写一个通用的邮箱正则表达式
  2. 【JavaScript】document对象属性
  3. 【NLP】业界总结 | BERT的花式玩法
  4. Protobuf使用规范分享
  5. 【C++】 67_经典问题分析 五
  6. 拿网站服务器的作用,谈在线网站服务器监控(二)之使用的基本功能要求
  7. CentOS7 安装 Mysql 服务
  8. Elasticsearch 实现自定义排序插件(转载)
  9. 华中科技大学2005年计算机组成原理试题,华中科技大学2005年计算机组成原理试题...
  10. esp32录音功能开发_TinyPICO-比拇指还小的ESP32开发板- 国外创客众筹发现第二期
  11. 如何卸载mingw_minGW在windows安装 | 学步园
  12. iPhone描述文件怎么用,过期如何处理
  13. cache abstraction
  14. dpdk 驱动移植叩开 kni 模块那些黑暗的角落
  15. 对与、或、非、异或、或非、与非的理解和记忆
  16. 博世中国创新软件开发中心 BCSC
  17. 微信小程序跳小程序short-link(#小程序://)
  18. 科技业界10大最具争议成功决定:苹果iPhone
  19. 浅谈数字证书的今生前世
  20. 【长尾理论】的简单阐述

热门文章

  1. 手机客户端数据传输加密设计
  2. 有效记忆nginx正反代理定义
  3. matlab 图像去雾算法,各种图像去雾算法
  4. 【暴利项目】一个人就能创业的赚钱项目,踏踏实实年入15-20万
  5. 没见过女人的小和尚——SVDD
  6. 央行数字货币推出,银行IT迎来新一轮发展东风
  7. 村上春树——总之岁月漫长,然而值得等待
  8. smark的简单介绍
  9. 原型继承(个人认为)
  10. FTP协议中的RETR和STOR命令