最近在一个程序中需要一串16进制字符串转换成10进制

代码如下

String hex="c7";
hex = hex.toUpperCase();
int len = hex.length()/2;
byte[] b = new byte[len];
char[] hc = hex.toCharArray();
for (int i=0; i<len; i++){
	int p=2*i;
	b[i] = (byte) (charToByte(hc[p])<< 4 | charToByte(hc[p+1]));
}
for(int i=0;i<b.length;i++){
	System.out.println(b[i]);
}
private static byte charToByte(char c) {
	return (byte) "0123456789ABCDEF".indexOf(c);
}

 

!那么这就出现了一个问题,16进制7F以内都能正常转换,两个16进制大于7F即大于01111111,就会变为-128+上后面的溢出的数,所以以本例来说,’C7‘的二进制是11000111,我想它显示199,而它显示-128+4*16+7=-57

而主要的问题就是这个8位问题,只要将换成unsigned,忽略最高位的标志位,那么范围就为0~255,而java中是没有unsigned类型的,那这里我们进行转换成16进制

0xff在java中代表00000000 11111111

所以用我们溢出的数与0xff与运算,所以110001111变为00000000 110001111,就显示正确了,我们想要的数字就是199

所以在我们转换出去的16进制数中,加上&0xFF就可以了

比如上面的for循环中加上

 for(int i=0;i<b.length;i++){
         System.out.println(b[i]&0xff );
 }

就可以了

 

 

您或许感兴趣

[2017-09-17]自适应@media样式失效--幺九博客
[2017-09-07]window下自动备份文件夹
[2017-10-01]IE/Edge浏览器元素设置position:fixed后滚动屏幕闪跳
[2017-10-15]wordpress使用Crayon Syntax Highlighter 自定义文本背景

发表评论

电子邮件地址不会被公开。