繁体   English   中英

字节数组(以十六进制表示)转换为Int问题。 (科特林/爪哇)

[英]Array of Bytes (as hex) conversion to Int issue. (Kotlin/Java)

我正在查看来自温度/湿度传感器的信息,该信息随附以下说明:

有6个字节。

  1. 温度正/负:0表示正(+),1表示负(-)

  2. 温度的整数部分。 以十六进制显示。

  3. 温度的小数部分。 以十六进制显示。

  4. 保留字节。 忽略它。

  5. 湿度的整数部分。 以十六进制显示。

  6. 湿度的小数部分。 以十六进制显示。

例如:00 14 05 22 32 08表示+ 20.5C 50.8%&01 08 09 00 14 05表示-8.9C 20.5%

因为每个字节都以十六进制表示,所以我需要将其隐式转换为Int,我遵循这种方法-Java代码将字节转换为十六进制,但是在验证其示例时获得的值没有意义。

val example = byteArrayOf(0, 14, 5, 22, 32, 8)
example.map { Integer.parseInt(String.format("%02X ", it),16)}

第一个示例输出为;

0 = "00 "
1 = "08 "
2 = "09 "
3 = "00 "
4 = "0E "
5 = "05 "

第二个示例输出;

0 = "00 "
1 = "0E "
2 = "05 "
3 = "16 "
4 = "20 "
5 = "08 "

我究竟做错了什么? 我开始认为制造商的说明可能会“误导”

这里缺少的关键是,将it参数传递给String#format ,该值为十进制 int而不是十六进制 int

相反,您希望将数组中的值直接映射到字符串,然后获取其十进制值:

byte it = 14;
int x = Integer.parseInt(String.valueOf(it), 16);
System.out.println(x); // This will print 20

这应该为您带来预期的结果。


注意,您的问题有点令人困惑,因为您的字节数组中的数字是十进制数字...已经以其十六进制“格式”显示。 有几种方法可以解决这种混淆(假设您可以控制数组的类型和/或内容):

  • 使用String而不是byte
String it = "14";
int x = Integer.parseInt(it, 16);
System.out.println(x); // This will print 20
  • 将值存储为十六进制并仍进行转换(即,在每个数字前放置一个0x
byte it = 0x14;
int x = Integer.parseInt(String.format("%02X", it), 16);
System.out.println(x); // This will print 20
  • 将值存储为十六进制,并且不进行转换,因为不需要
byte it = 0x14;
System.out.println(it); // This will print 20

如果使用第二个项目符号,尽管有些麻烦,但现在应该可以使用,但是如果您要对字节数组的值进行硬编码,则第三个选项是最好的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM