Java不是一个完全面向对象的编程语言,因为其有基本数据类型的存在,在Java中所有的数值类的基本数据类型都是有符号数,而在嵌入式系统常用的C语言编程的数据则分为有符号和无符号两种类型,通常用于数据通讯与数据交互的都是无符号类型,尤其是使用SerialPort或者LibUSB这种接口与PC进行数据传输时尤为明显。
以SerialPort为例,通常嵌入式编程中使用8bit数据位为一帧的方式传送数据,通常为无符号数,比如一个float类型占4个字节,通常需要接受4帧才能恢复出一个float类型的数据,Java在这方面就显得有些力不从心了,虽然有DataInputStream这种类或者某些包装类的方法可以解决这个问题,但通常要么就是花费比较大的资源要么要么就是功能不够全面并且现在很多JDK里的数据转化存在BUG,比如Integer.parseInt(num,radix)这种方法如果你粘贴进去负数的二进制进去,那么就会产生异常了。
使用JHex工具类可以解决这些问题,比如你可以轻松的使用toFloat(byte[] arr)这种函数把4帧byte数据转化成一个float类型,你可以使用getBitValue(int number,int bitAt)函数获取数值在某一个二进制位上的值等等 ,或者使用toByteArray(int number)将一个整型数转化成4帧byte数组并后续通过串口发送出去。
1. 将整形、浮点型等多字节数据转化成byte类型数组。
2. 逆向变换将byte数组转化成相应的整形或者浮点型数据。
3. 将任意数转化成二进制或者十六进制的字符串。
4. 位运算,提取某些位的值或者改变某些位的值得到新值。
5. 任意进制字符串之间的转化。
6. 有符号和无符号数之间的转化。
/* * 将一个整型数转化成4字节的byte数组 */ public static byte[] toByteArray(int number) { byte[] bytes = new byte[4]; for (int i = 0; i < 4; i++) { bytes[i] = (byte) (number >>> (24 - i * 8)); } return bytes; }
@Test public void test() { int number = 1024; byte[] byteArray = JHex.toByteArray(number); System.out.println(Arrays.toString(byteArray)); }
输出结果: