1. 程式人生 > >java字串和位元組的探討

java字串和位元組的探討

網路通訊,嵌入式軟體 會發來資料包,經常以 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 是一個對映。