我使用android中的库连接到终端模拟器,它连接到串行设备(交换机)并显示发送/接收的数据。
然而,我只是发送字节数组,所以我不知道交换机处于什么状态,是启用更多还是配置模式等。这导致我可能以错误的模式输入命令,他们赢了不行。然后,交换机处于不可恢复的模式,因为我发送了错误的命令,无法删除它或进入新线路。我现在要解决的问题是我不知道的问题;我不知道交换机所处的模式。我知道在发送命令后我可以有三种不同的返回提示:
switch>
switch#
switch(config)#
所以我在想,如果我读到收到的最后两个字符,我就可以知道我在哪个模式.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#和)#,然后我可以根据我获得的值设置全局变量背部?也许从最后向后搜索?
答案 0 :(得分: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 :(得分: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())