JHex二進(jìn)制數(shù)據(jù)處理和基本數(shù)據(jù)類型轉(zhuǎn)換工具類
JHex工具類
簡介
Java不是一個(gè)完全面向?qū)ο蟮木幊陶Z言,因?yàn)槠溆谢緮?shù)據(jù)類型的存在,在Java中所有的數(shù)值類的基本數(shù)據(jù)類型都是有符號(hào)數(shù),而在嵌入式系統(tǒng)常用的C語言編程的數(shù)據(jù)則分為有符號(hào)和無符號(hào)兩種類型,通常用于數(shù)據(jù)通訊與數(shù)據(jù)交互的都是無符號(hào)類型,尤其是使用SerialPort或者LibUSB這種接口與PC進(jìn)行數(shù)據(jù)傳輸時(shí)尤為明顯。
以SerialPort為例,通常嵌入式編程中使用8bit數(shù)據(jù)位為一幀的方式傳送數(shù)據(jù),通常為無符號(hào)數(shù),比如一個(gè)float類型占4個(gè)字節(jié),通常需要接受4幀才能恢復(fù)出一個(gè)float類型的數(shù)據(jù),Java在這方面就顯得有些力不從心了,雖然有DataInputStream這種類或者某些包裝類的方法可以解決這個(gè)問題,但通常要么就是花費(fèi)比較大的資源要么要么就是功能不夠全面并且現(xiàn)在很多JDK里的數(shù)據(jù)轉(zhuǎn)化存在BUG,比如Integer.parseInt(num,radix)這種方法如果你粘貼進(jìn)去負(fù)數(shù)的二進(jìn)制進(jìn)去,那么就會(huì)產(chǎn)生異常了。
使用JHex工具類可以解決這些問題,比如你可以輕松的使用toFloat(byte[] arr)這種函數(shù)把4幀byte數(shù)據(jù)轉(zhuǎn)化成一個(gè)float類型,你可以使用getBitValue(int number,int bitAt)函數(shù)獲取數(shù)值在某一個(gè)二進(jìn)制位上的值等等 ,或者使用toByteArray(int number)將一個(gè)整型數(shù)轉(zhuǎn)化成4幀byte數(shù)組并后續(xù)通過串口發(fā)送出去。
現(xiàn)版本的主要功能
1. 將整形、浮點(diǎn)型等多字節(jié)數(shù)據(jù)轉(zhuǎn)化成byte類型數(shù)組。
2. 逆向變換將byte數(shù)組轉(zhuǎn)化成相應(yīng)的整形或者浮點(diǎn)型數(shù)據(jù)。
3. 將任意數(shù)轉(zhuǎn)化成二進(jìn)制或者十六進(jìn)制的字符串。
4. 位運(yùn)算,提取某些位的值或者改變某些位的值得到新值。
5. 任意進(jìn)制字符串之間的轉(zhuǎn)化。
6. 有符號(hào)和無符號(hào)數(shù)之間的轉(zhuǎn)化。
代碼樣例
/*
* 將一個(gè)整型數(shù)轉(zhuǎn)化成4字節(jié)的byte數(shù)組
*/
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));
}
輸出結(jié)果:

