将ascii转换为int值

问题描述

我通过串行接收一个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的日志

enter image description here

解决方法

此处不会发生错误“无效的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)是很奇怪的。感觉更合乎逻辑的解释是您的代码有错误。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...