将 ascii 值转换为 int 值
Convert ascii to int Value
我通过串口接收到一个用于显示编码器rpm值的ascii值,我试图将这些值转换为一个int但我遇到了一些值的问题,出现以下错误returns me sometimes java.lang.NumberFormatException: Invalid 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 的日志
这里不能出现错误'invalid int: "2"'。它实际上是无效的 int:“X2X”,其中 X 之一是某个 space-looking 字符,可能是实际的 space (ascii 0x20),可能是空字符 (ascii 0x00)。
您需要阅读协议文档。显然它有时会发送 0x30 0x44(ascii-ese 代表“0D”),它被解析为十六进制字符串,意思是:13 的十进制值。但有时它会发送,例如,0x20 0x32(ascii-ese 对于 space 后跟数字 2),你不能像这样传递给 parseInt,你必须摆脱那个 space.
您的编辑和评论并没有真正说明您得到了什么;打印rpm[9]和rpm[10]的原始值就知道了。
另一种选择是您已取消同步:例如,协议说 'next 4 bytes are the length' 并且您只读了 3,所以现在您是 off-by 1,并且您正在读一个space-like 字符,它不是十六进制数字的一部分,而是较早的内容,以及 2 个十六进制数字 (2) 中的第一个,然后将其扔到 parseInt。我这么说是因为有时发送“0D”有时发送“2”(即 space,然后是 2)的协议很奇怪。感觉比较合乎逻辑的解释是你的代码有bug
我通过串口接收到一个用于显示编码器rpm值的ascii值,我试图将这些值转换为一个int但我遇到了一些值的问题,出现以下错误returns me sometimes java.lang.NumberFormatException: Invalid 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 的日志
这里不能出现错误'invalid int: "2"'。它实际上是无效的 int:“X2X”,其中 X 之一是某个 space-looking 字符,可能是实际的 space (ascii 0x20),可能是空字符 (ascii 0x00)。
您需要阅读协议文档。显然它有时会发送 0x30 0x44(ascii-ese 代表“0D”),它被解析为十六进制字符串,意思是:13 的十进制值。但有时它会发送,例如,0x20 0x32(ascii-ese 对于 space 后跟数字 2),你不能像这样传递给 parseInt,你必须摆脱那个 space.
您的编辑和评论并没有真正说明您得到了什么;打印rpm[9]和rpm[10]的原始值就知道了。
另一种选择是您已取消同步:例如,协议说 'next 4 bytes are the length' 并且您只读了 3,所以现在您是 off-by 1,并且您正在读一个space-like 字符,它不是十六进制数字的一部分,而是较早的内容,以及 2 个十六进制数字 (2) 中的第一个,然后将其扔到 parseInt。我这么说是因为有时发送“0D”有时发送“2”(即 space,然后是 2)的协议很奇怪。感觉比较合乎逻辑的解释是你的代码有bug