基於字元流命令的內容解釋

2021-09-01 15:06:35 字數 3001 閱讀 5426

基於字元流命令的內容解釋

[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...