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 是一个映射。

猜你喜欢

转载自blog.csdn.net/qq_25911515/article/details/82777575