Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在字节数组中查找特定字符?_Java_Android_Arrays_String - Fatal编程技术网

Java 在字节数组中查找特定字符?

Java 在字节数组中查找特定字符?,java,android,arrays,string,Java,Android,Arrays,String,我使用android中的一个库连接到一个终端仿真器,它通过一个开关连接到一个串行设备,并向我显示发送/接收的数据 然而,我只是来回发送字节数组,所以我不知道交换机处于什么状态,它是在启用更多还是在配置模式等。这导致我可能以错误的模式输入命令,它们将无法工作。然后开关处于不可恢复模式,因为我发送了错误的命令,无法删除它或进入新行。我现在试图解决的问题是我不知道的问题;我不知道开关处于什么模式。我知道在发送命令后,可以有三种不同的返回提示: switch> switch# switch(con

我使用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,然后根据返回的值设置全局变量?也许从结尾向后搜索?

你的意思是

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())
你是说

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())
我将搜索字节[],避免转换为字符串的开销

如果从末尾开始搜索更有效,这取决于您获得的数据。我不能从你在问题中贴出的小例子来判断这一点

如果只需要查看最后两个字符:

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


if(data[data.length-2]=='h' && data[data.length-1]=='#') // "h#"
或者,如果不是那么简单,则使用循环来迭代数组

p.s.I假设上述代码采用ASCII编码,我将搜索字节[],避免转换为字符串的开销

如果从末尾开始搜索更有效,这取决于您获得的数据。我不能从你在问题中贴出的小例子来判断这一点

如果只需要查看最后两个字符:

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


if(data[data.length-2]=='h' && data[data.length-1]=='#') // "h#"
或者,如果不是那么简单,则使用循环来迭代数组



p.s.I假设上述代码采用ASCII编码

我认为,将其转换为字符串是最简单、最清晰的方法。我也会这样做。当将其转换为字符串时,不要忘记指定编码。为什么有必要指定,我从未对字符串进行过编码,对此表示歉意。所以我会把它编码成ascii码?UTF8?这些选择对我有什么影响?@Paul:你需要解码你得到的字节。因此,您需要知道终端对它们的编码方式。看起来它们是十进制的,因为ascii图表上的十进制数字与我看到旁边的字母时得到的数字相对应。不过我不知道该怎么办。我会读一读,我认为,把它转换成字符串是最简单、最清晰的方法。我也会这样做。当将其转换为字符串时,不要忘记指定编码。为什么有必要指定,我从未对字符串进行过编码,对此表示歉意。所以我会把它编码成ascii码?UTF8?这些选择对我有什么影响?@Paul:你需要解码你得到的字节。因此,您需要知道终端对它们的编码方式。看起来它们是十进制的,因为ascii图表上的十进制数字与我看到旁边的字母时得到的数字相对应。不过我不知道该怎么办。我会读的,我会输入一个命令,然后返回数千个字符,然后换行,然后是提示。因此,是的,我想这将是最后两个重要的问题。除非我能想到一种情况,它们不会是最后两个,我可以使用循环。你的方式似乎很合理。如果很容易避免的话,我想我不应该转换成字符串。只有4个字节?你知道他们应该是什么意思吗?解释为ASCII,它们是我逃避的(J.S.)你的终端不使用ASCII。所以你必须找出它使用的编码/字符集。我认为几乎每个终端仿真器都可以使用ASCII。你可能需要配置它。但是考虑到使用ASCII,你不能传输非ASCII字符。H=104,>=62,而= 35WELL,我将输入一个命令,可能有成千上万个。返回的字符,然后是换行符,然后是提示。所以是的,我想最后两个字符会很重要。除非我能想到一种情况,它们不会是最后两个,我可以使用循环。你的方法似乎很合理。我想如果很容易避免的话,我不应该转换为字符串。只有4个字节?你知道它们是什么吗应该是什么意思?解释为ASCII他们是我逃避的[j],你的终端不使用ASCII。所以你必须找出它使用的编码/字符集。我认为几乎每个终端仿真器都可以使用ASCII你可能需要配置它。但是考虑到使用ASCII你不能传输非ASCII字符。H=104,>=62,和= 35.谢谢,我想到ReGEX等,但是我需要知道它们。
分别执行不同的操作,因此我认为使用正则表达式太简单,Smith42先生的答案就足够了。谢谢,我想到了正则表达式等,但我需要分别了解它们以执行不同的操作,因此我认为使用正则表达式太简单,Smith42先生的答案就足够了。