2013-01-09 3 views
1

안드로이드의 라이브러리를 사용하여 터미널 에뮬레이터에 연결하고 있는데,이 장치는 직렬 장치 (스위치)에 연결되어 전송/수신 데이터를 보여줍니다.바이트 배열에서 특정 문자를 찾으십니까?

그러나 바이트 배열을 보내면서 스위치 상태를 알 수 없으므로 더 많은 또는 구성 모드 등을 사용할 수 있습니다. 잘못된 모드에서 명령을 입력 할 가능성이 높습니다. 작동하지 않습니다. 스위치는 잘못된 명령을 보내면 복구 할 수없는 모드가되어 삭제하거나 새 행을 찾을 수 없습니다. . 그래서

switch> 
switch# 
switch(config)# 

: 내가 지금은 처리하려고 문제는 내가 돈 사람이다 내가 명령을 보낸 후 t 스위치가에있는 모드를 알고 난 세 가지 수익을 가질 수있는 프롬프트 알고 나는 마지막 두 문자를 읽으면 내가 어떤 모드인지 알 수 있다고 생각하고 있었다. h>, h # 그리고 #

나는이 방법으로 데이터를 받았다.

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

String으로 변환하는 것이 가장 간단하고 명확한 방법이라고 생각합니다. 나는 그렇게 할 것입니다. – Andremoniy

+1

문자열로 변환 할 때 인코딩을 지정하는 것을 잊지 마십시오. – jlordo

+0

왜 내가 문자열을 인코딩 한 적이 없으며, 무지에 사과드립니다. 그래서 나는 ascii로 그것을 인코딩하겠습니까? UTF8? 이 선택이 나를 어떻게 영향을 줍니까? – Paul

답변

4

를 사용하여 간단.

끝에서 검색을 시작하는 것이 더 효과적이라면 얻은 데이터에 따라 다릅니다. 나는 당신이 당신의 질문에 게시 한 작은 예제로 이것을 판단 할 수 없습니다.

당신이 마지막 두 문자를보고해야하는 경우

:

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 그래서 인코딩이 옳지 않다고 생각한다. 마지막 2 바이트가 아닌 것 같아 루프가 최상일 수도 있습니다. – 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)#")) 

또는 내가 byte[]를 검색하고 String로 변환에서 오버 헤드를 피할 것 정규식

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

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

고마워, 내가 정규식 등 생각하지만 별도로 다른 작업을 수행하기 위해 그들을 알고, 그래서 내가 정규식으로 귀찮게 너무 간단하고 MrSmith42의 답변 충분 것이라고 생각해야합니다. – Paul

관련 문제