Android 10進位制轉16進位制
阿新 • • 發佈:2019-02-11
之前由於工作需要,用到串列埠通訊。在用網上谷歌開源的串列埠通訊程式碼向串列埠傳送指令時,由於機器接收的是16進位制的指令。後來發現初始16進位制的byte陣列經過一系列轉換後,變成了10進位制的byte陣列,當使用OutputStream的write方法向串列埠傳送該陣列時,機器沒有反應。
後來心中便猜想是不是write(1)和write(0x01)到機器那邊是不是不一樣的資料。結果後來測試果然是不一樣的。於是就需要想辦法把10進位制的byte陣列轉換成16進位制。
網上查了很多資料,很多部落格都是使用Integer.toHexString()來轉換,但是這只是轉換成16進位制字串顯示,實際上還是和原始的byte16進位制陣列不一樣的,即使使用轉換後的String.getBytes[]也是一樣。
解決方案:
經過查詢,系統api裡並沒有10進位制轉換成16進位制的方法,因此這裡自己寫出轉換的方法。
/**
* 普通字元轉換成16進位制字串
* @param str
* @return
*/
public static String str2HexStr(String str)
{
byte[] bytes = str.getBytes();
// 如果不是寬型別的可以用Integer
BigInteger bigInteger = new BigInteger(1, bytes);
return bigInteger.toString(16);
}
/** 16進位制的字串轉換成16進位制字串陣列
* @param src
* @return
*/
public static byte[] HexString2Bytes(String src) {
int len = src.length() / 2;
byte[] ret = new byte[len];
byte[] tmp = src.getBytes();
for (int i = 0; i < len; i++) {
ret[i] = uniteBytes(tmp[i * 2 ], tmp[i * 2 + 1]);
}
return ret;
}
public static byte uniteBytes(byte src0, byte src1) {
byte _b0 = Byte.decode("0x" + new String(new byte[]{src0})).byteValue();
_b0 = (byte) (_b0 << 4);
byte _b1 = Byte.decode("0x" + new String(new byte[]{src1})).byteValue();
byte ret = (byte) (_b0 ^ _b1);
return ret;
}
/*
* 位元組陣列轉16進位制字串顯示
*/
public String bytes2HexString(byte[] b,int length) {
String r = "";
for (int i = 0; i < length; i++) {
String hex = Integer.toHexString(b[i] & 0xFF);
if (hex.length() == 1) {
hex = "0" + hex;
}
r += hex.toUpperCase();
}
return r;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
使用方法:
1、如果原始是10進位制的byte陣列,則先呼叫byte2HexString()方法將其轉換成16進位制顯示的String字串,然後呼叫HexString2Bytes()方法得到16進位制的byte陣列。
2、如果原始是字串,則呼叫str2HexStr()方法將其轉換成16進位制字串,然後呼叫HexString2Byte()得到16進位制byte陣列。
最後,呼叫OutputStream物件的write()方法將資料輸出。
原文地址:https://blog.csdn.net/u013564742/article/details/74390820