基於字元流命令的內容解釋
[size=medium][b][color=indigo]1、概述[/color][/b][/size]
我們常常需要解釋ascii碼的輸入流,這些輸入流讀入時一般是以位元組陣列的形式,這些輸入還會包括命令或控制字元,對應不同的命令或控制字元都有不同的處理方式。而解釋和匹配這些命令常常會令我們頭痛。這裡介紹一種方法可以有效的處理這些命令。
[size=medium][b][color=indigo]2、場景[/color][/b][/size]
以vt100 terminal control為例,這些控制命令是嚴謹的不會發生混淆的,他的命令有如:
[c[0c
[;r[;...;m
[;""p
[size=medium][b][color=indigo]3、分析[/color][/b][/size]
上面這些命令主要分為:
(i)明確的命令([c)
(ii)定長可變的命令([0c、[;r)
(iii)變長但可窮舉的命令([;...;m)
(iv)變長命令([;""p)
對於前三種命令的處理都還算好,對於最後變長命令的處理就比較困難,因為其長度是由來決定的,這裡不對這種命令進行討論。
對於前三種命令最長的長度是10個位元組(不帶,以vt100為例),因為所有的命令及長度都是已知的,所以處理進來比較容易。
對於這些控制字元的處理比較普遍的做法是使用控制語句,如:
if(b =='')else if(currentchar() == '')}}
你會發現這種判斷語句寫起來真的很暈,特別是使用乙個指標來拿nextchar,不能匹配的話還得要回退,不容易想清楚,別人也難以讀懂。
[size=medium][b][color=indigo]4、解決辦法[/color][/b][/size]
使用逐個字元來判斷的確不是乙個好的方法,這裡推薦另一種做法,使用定長位元組資料進行判斷。這種方法的具體做法如下:
a)把(i)明確的命令使用hash code及對應的處理方法存入map中,其中hash code為該控制命令位元組陣列的hash code,儲存的形式如:map(hashcode, processmethod)。
b)處理(ii)定長可變的命令和(iii)變長但可窮舉的命令,使用類似如下的語句:
byte bs = new byte[len];
system.arraycopy(src, startpos, bs, 0, len);
byte b1 = cs[0], b2 = cs[cs.length - 2], be = cs[cs.length - 1];
if (b1 != '[')
switch (len) ;...;m //[0c
if (be == 'm' || (be == 'c' && b2 == '0'))
break;
case 5:
if (be == 'm' || be == 'r' || be == 'h' || be == 'f' || be == 'r' || (be == 'c' && b2 == '0'))
break;
case 6:
//...
break;
case 7:
//...
break;
case 8:
//...
break;
case 9:
//...
break;
case 10:
//...
break;
default:
break;
}
[size=medium][b][color=indigo]5、整個程式的結構[/color][/b][/size]
mapmap = new hashmap();
private listlist = arrays.aslist(new byte[1], new byte[2],
new byte[3], new byte[4], new byte[5], new byte[6], new byte[7],
new byte[8], new byte[9], new byte[10]);
private void init() ), new processmethod());
}private void process(byte bs, int start, int len)
for (int i = start; i < len; i++) else
byte b1 = cs[0], b2 = cs[cs.length - 2], be = cs[cs.length - 1];
int old = i;
if (b1 != '[')
switch (j + 1) ;...;m //[0c
if (be == 'm' || (be == 'c' && b2 == '0')) .process();
}break;
case 5:
if (be == 'm' || be == 'r' || be == 'h' || be == 'f' || be == 'r' || (be == 'c' && b2 == '0')) .process();
}break;
case 6:
break;
case 7:
break;
case 8:
break;
case 9:
break;
case 10:
break;
default:
break;
}if (old != i) }}
}}}
day21 IO 字元流 字元流其他內容 遞迴
21.01 io流 字元流filereader 2.filereader filereader fr new filereader aaa.txt 建立輸入流物件,關聯aaa.txt int ch while ch fr.read 1 fr.close 關流 21.02 io流 字元流filewri...
基於ACL的簡化流策略命令
traffic statistic 用來介面上配置基於acl的流量統計reset traffic statistics 用來清除裝置上基於acl的報文過濾的流量統計資訊 traffic filter 用來在介面上配置基於acl的報文過濾traffic secure 用來在介面上配置基於acl的報文過...
linux中ps命令所得內容的解釋
linux上程序有5種狀態 1.執行 正在執行或在執行佇列中等待 2.中斷 休眠中,受阻,在等待某個條件的形成或接受到訊號 3.不可中斷 收到訊號不喚醒和不可執行,程序必須等待直到有中斷發生 4.僵死 程序已終止,但程序描述符存在,直到父程序呼叫wait4 系統呼叫後釋放 5.停止 程序收到sigs...