我正在查看来自温度/湿度传感器的信息,该信息随附以下说明;
有6个字节。
温度正负:0表示正(+),1表示负(-)
温度的整数部分。以十六进制显示。
温度的小数部分。以十六进制显示。
保留的字节。忽略它。
湿度的整数部分。以十六进制显示。
湿度的小数部分。以十六进制显示。
例如:00 14 05 22 32 08表示+ 20.5C 50.8%&01 08 09 00 14 05 表示-8.9C 20.5%
由于每个字节都以十六进制表示,因此我需要将其隐藏为一个整数,我遵循这种方法-Java code To convert byte to Hexadecimal,但在验证其示例时获得的值没有意义。在Kotlin中,我知道; >
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 "
我在做什么错?我开始认为制造商的说明可能会“误导”
答案 0 :(得分:3)
您在这里缺少的关键是,将it
参数传递给String#format
时,该值是十进制 int
,而不是< em>十六进制 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
如果使用第二个项目符号,尽管有些复杂,但现在应该可以使用,但是如果您要对字节数组的值进行硬编码,那么第三个选项是最好的。