问题描述
我通过串行接收一个ascii值,该值用于显示编码器的rpm值,我试图将这些值转换为一个int值,但是某些值存在问题,以下错误有时使我返回java .lang.NumberFormatException:无效的int:“ 2”
public void run() {
byte[] rpm = (read.getBytes(StandardCharsets.US_ASCII));
if(rpm.length >=12) {
char ch0 = (char) rpm[9];
char ch1 = (char) rpm[10];
String s = new StringBuilder().append(ch0).append(ch1).toString();
a = Integer.parseInt(s,16);
值ch0和ch1的日志
解决方法
此处不会发生错误“无效的int:“ 2””。它实际上是无效的整数:“ X2X”,其中X之一是一些看起来像空格的字符,可能是实际的空格(ascii 0x20),可能是空字符(ascii 0x00)。
您需要阅读该协议的文档。显然,它有时会发送0x30 0x44(对于“ 0D”,它是ascii-ese),这将被解析为十六进制字符串,其含义是:十进制值13。但是有时,它会发送例如0x20 0x32(ascii-ese对于后面跟着数字2的空格,您不能像这样将其传递给parseInt,则必须摆脱该空格。
您的编辑和评论实际上并不清楚您得到了什么;打印rpm [9]和rpm [10]的原始值。
另一种选择是您已取消同步:例如,协议说“下一个4个字节是长度”,而您仅读取3,所以现在您减1,而您正在读取一个空格类似字符,它不是十六进制数字的一部分,而是较早的东西,以及2个十六进制数字的第一个(2),然后在parseInt处将其抛弃。我之所以这么说,是因为有时发送“ 0D”有时发送“ 2”的协议(这是一个空格,然后是2)是很奇怪的。感觉更合乎逻辑的解释是您的代码有错误。