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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值