java字串和位元組的探討
阿新 • • 發佈:2018-11-01
網路通訊,嵌入式軟體 會發來資料包,經常以 16進位制字串表示例如 "45FF002C"
一個無符號整形 byte範圍可以是0~255, 1111 1111
java 中一個位元組 剛好可以用2個16進位制位表示:例如FF,但是java 的byte 不可以用 大於127 的整數表示,所以
將2個16進位制字串轉為1個位元組
"7F".HexString2Bytes=127, "80".HexString2Bytes= -128, 這是可以自定義的,因為0~255 可以裝下 2個16進位制數
public static byte[] HexString2Bytes(String hexstr) { byte[] b = new byte[hexstr.length() / 2]; int j = 0; for (int i = 0; i < b.length; i++) { char c0 = hexstr.charAt(j++); char c1 = hexstr.charAt(j++); b[i] = (byte) ((parse(c0) << 4) | parse(c1)); } return b; } private static int parse(char c) { if (c >= 'a') return (c - 'a' + 10) & 0x0f; if (c >= 'A') return (c - 'A' + 10) & 0x0f; return (c - '0') & 0x0f; }
如上面"45FF002C" 中的45
"45".HexString2Bytes=69, 69表示的的ASCII 碼值是:"E" ,"E".getBytes()=69 String 的這個方法是得到ASCII碼值
結論: a. 2個16進位制字串,可以轉為1個byte,小於127 為正,大於127 從-128開始,7F 開始
b.2個16進位制字串,小於127 ,可以轉為1個ASCII 碼的字元.
補充: 將一個位元組陣列copy 到另一個,經常使用
byte bb[]=new byte[]{11,22,33,44,55,66,77}; int length=bb.length; byte cc[] = new byte[length]; //bb 0 源陣列 ,源陣列起始位置 //cc 0 length 目標陣列,目標陣列起始位置,目標陣列結束位置 System.arraycopy(bb,0,cc,0,length); length 不能小於bb 的實際長度,不然會陣列下標越界
補充:java 一個位元組表示不了大於127 , 例如 0xF2 用一個位元組表示 -14,計算機 補碼1111 0010;但如果是無符號 1111 0010 表示的整數就是242; 所以242-->-14 是一個對映。