gpt4 book ai didi

java - 在字节数组中捕获

转载 作者:行者123 更新时间:2023-11-30 08:03:40 24 4
gpt4 key购买 nike

我编写了一个事件监听器,用于读取来自接收方的任何特定类型的消息。

这是我的事件监听器:

class SerialPortReader implements SerialPortEventListener {
public void serialEvent(SerialPortEvent event) {
if (event.isRXCHAR() && event.getEventValue() > 0) {
try {
byte[] buffer = SP.readBytes(6);
String type = new String(buffer);
if (type.equals("$GPGGA")){
String line = "";
line = line + type;
buffer = SP.readBytes(66);
String values = new String(buffer);
line = line + values;
writer.write(line + "\n");
}
}
catch (SerialPortException ex) {System.out.println(ex);}
catch (IOException ex) {System.out.println(ex);}
}
}
}

现在,在我检查消息的类型是否正确后,我刚刚读取了 80 个字节的数据,这大约是消息的大小。但是,有时消息并不完整,因此它比平时更短。这是消息结构: enter image description here

如您所见,消息以 <CR><FL> 结尾.我想修改我的方法,以便它一次读取每个字节并在到达消息末尾时停止读取。我怎样才能 catch <CR><FL>在字节数组里面?

如有任何帮助,我们将不胜感激。谢谢。

最佳答案

这取决于“消息”的定义:它们是固定长度的还是由特定序列分隔的?在您当前的代码中,您正在读取一个 6 字节长的“ header ”和一个 66 字节长的“消息”。但是,看起来您实际上并不知道先验长度,而是消息以换行符结尾。几点建议:

  • 您正在从流中读取字节,然后使用 String(byte[]) 构造函数将它们转换为字符串。 documentation指出这使用了 default charset对于您的平台,它可能是 UTF-8、Latin-1 或任何区域默认值。如果您通过串行端口与设备通信,这可能不是您想要的,因为该设备可能有一个单一的、特定的消息字符集(可能是 ASCII?)。调查这一点并使用 this String ctor或者,如果你想在输入包含不可解码的垃圾时得到通知,CharsetDecoder class .
  • 如果消息是基于文本的换行符分隔的,您绝对应该使用BufferedReader从流中读取。假设您的 SP 串口是一个 InputStream,您可以在其上创建一个 BufferedReader,然后调用读取器的 readLine() 方法。读取器将不断从流中请求字节,直到它看到换行符,然后将整行作为字符串返回给您。 Reader 对象还封装了我之前谈到的 Charset。

关于java - 在字节数组中捕获 <CR><LF>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36129292/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com