Java中byte转换为16进制的字符串一些自己的见解


昨天写到一个md5加密的方法,里面是通过将字符串通过MD5加密算法得到新的字符串,首先string转换经过md5算法得到byte数组,将byte数据转换成int数据类型,在调用Integer.toHexString方法转换成为十六进制的字符串。具体代码如下:

      public static void main(String[] args) throws NoSuchAlgorithmException {
  		MessageDigest mDigest=MessageDigest.getInstance("MD5");
		String pwd="123456";
		String temp;
		byte[] md=mDigest.digest(pwd.getBytes());
		StringBuilder sb=new StringBuilder();
		for(byte b:md){
		     int a=b&0xff;
		     temp=Integer.toHexString(a);
		     if(temp.length()==1){
		    	 sb.append(0+a);
		     }else {
				sb.append(temp);
			}
		}
		System.out.println(sb.toString());
		
	}
但是看到int a=b&0xff 我就纳闷了,为什么你要加一步这个操作。你直接强转不就好了。int a=(int)b 不可以么,但是这样确实不行,其他的博客里面从Java采用的是补码的运算,加上补位(有符号的补位)的问题的角度来解释的,但是我觉得还是没有解释清楚。这里我给大家提供一种角度。

          byte a=-1;
          int b=a&0xff;
          System.out.println("0x"+Integer.toHexString(a));
          System.out.println("0x"+Integer.toHexString(b));
分别输出:

   a:0xfffffff
   b:0xff

好~我们回归下本质:byte是8位的int是32位,我们调用Integer.toHexString()方法无非就是想将数据转换为十六进制的字符串,但是byte的8位我们的想要的2个十六进制的数字,但是int是32位的他会给我们转换成8个2进制数字(只有在byte数据为负数的情况下,因为会默认在高位补1,正数没影响补0)。因此无论是正数的byte还是负数的byte,我们都加一步这个操作int a=b&0xff,这样高24位都会变成0,而我们也并不关心高24位,我们调用Integer.toHexString()就是想要的低8位的数据。因此,这时候就可以明白byte转换成16进制字符串时候要进行这样的操作的原因了。

但是注意这里byte的转换成int数据时候我们要区别开:

         byte a=-1;
         int b=a&0xffffffff;
	 int c=(int)a;
	 System.out.println(Integer.toBinaryString(a));
	 System.out.println(Integer.toBinaryString(a));
	 System.out.println(Integer.toBinaryString(a));
这里也就能解释通,为什么要&0xffffffff了,因为我们关心的是32位数据,不只是8位了,byte进行位扩展后,仍是原数据即正数补0,负数补1,&0xffffffff保持原数据的准确性。



  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值