2013-01-09 32 views
1

我正在使用android中的庫連接到終端模擬器,它連接到串行設備(交換機)並顯示我發送/接收的數據。查找字節數組中的特定字符?

不過我只是在發送的字節數組和背部,所以我不知道該開關處於什麼樣的地位,是它讓更多的還是配置模式等,這使我在錯誤的模式可能輸入命令,他們將無法工作。然後,交換機處於不可恢復模式,因爲我發送了錯誤的命令,無法將其刪除或換到新的行。 。我試圖解決現在的問題是一個,我不要;知道的模式開關在我知道我可以有三種不同的返回提示我發送一個命令後:

switch> 
switch# 
switch(config)# 

所以我在想,如果我讀了收到的最後兩個字符,我就可以知道我處於哪種模式。h>,h#and)#

我在這種方法中收到數據,只要收到數據,

public void onDataReceived(int id, byte[] data) 
{ 

    String str = new String(data); 
    ((MyBAIsWrapper) bis).renew(data); 

    mSession.write(str); 
    mSession.notifyUpdate(); 
    viewHandler.post(updateView); 
} 

要做到這一點的最佳方法是以某種方式搜索字節數組或將其轉換爲字符串並搜索字符串h>,h#和)#,然後我可以設置一個全局變量,取決於我返回的值?也許從頭到尾搜索?

+2

我認爲,將其轉換爲字符串是最簡單明瞭的方法。我也會這樣做。 – Andremoniy

+1

將其轉換爲字符串時,不要忘記指定編碼。 – jlordo

+0

爲什麼有必要指定,我從來沒有編碼一個字符串,爲無知道歉。所以我會把它編碼爲ascii? UTF8?這些選擇如何影響我? – Paul

回答

4

我會搜索byte[],避免轉換過程中的開銷爲String

如果是更好的性能,從月底開始搜索,取決於你得到的數據。我無法通過你在問題中發佈的小例子來判斷。

如果你只需要看看最後兩個字符:

if(data[data.length-2]=='h' && data[data.length-1]=='>') // "h>" 


if(data[data.length-2]=='h' && data[data.length-1]=='#') // "h#" 

,或者如果它不是那麼簡單,使用循環遍歷數組。

P.s.我假設上面的代碼的ASCII編碼

+1

那麼我會輸入一個命令,可能會返回數千個字符,然後是換行符,然後是提示符。所以是的,我想這將是最後兩個重要的。除非我能想到一個他們不會是最後兩個的情況,我可以使用循環。你的方式似乎很合理。我想我不應該轉換成字符串,如果它很容易避免。 – Paul

+0

我檢查了一下,我收到了數字,105 27,91 74,所以我猜測那個編碼是不對的。似乎他們不是最後兩個字節,所以也許循環是最好的。 – Paul

+1

只有4個字節?你知道他們應該是什麼意思嗎?解釋爲ASCII他們是'我'逃脫'[J'。 – MrSmith42

2

你的意思是?

if(str.endsWith("h>") || str.endsWith("h#") || str.endsWith(")#")) 

或簡單

if(str.equals("switch>") || str.equals("switch#") || str.equals("switch(context)#")) 

或使用正則表達式

final Pattern switched = Pattern.compile("switch(>|#|\\(\\w+\\)#)"); 

if(str.matcher(switched).matches()) 
+0

謝謝,我想到了正則表達式等,但我需要分別知道它們來執行不同的操作,所以我認爲這太簡單了,不能打擾正則表達式,並且MrSmith42的答案就足夠了。 – Paul

相關問題