欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java中进制的转换,Byte与16进制的转换方法

程序员文章站 2024-03-12 11:00:38
java中对于进制的转换有很多方式,其中对于常见的基本的二进制 八进制 十进制 十六进制等的转换有对于的包装类实现,不需要通过二外的算法来进行实现,具体如下: 首先关于最...

java中对于进制的转换有很多方式,其中对于常见的基本的二进制 八进制 十进制 十六进制等的转换有对于的包装类实现,不需要通过二外的算法来进行实现,具体如下:

首先关于最简单的二进制转换的方法有:

十进制转成十六进制:
string integer.tohexstring(int i)
十进制转成八进制
string integer.tooctalstring(int i)
十进制转成二进制
 string integer.tobinarystring(int i)
十六进制转成十进制
integer.valueof("ffff",16).tostring()   //不能处理带前缀的情况 0x
八进制转成十进制
integer.valueof("76",8).tostring()  //前缀0可以被处理
二进制转十进制
integer.valueof("0101",2).tostring() 

有什么方法可以直接将2,8,16 进制直接转换为10进制的吗 ?

java.lang.integer类

parseint(string s, int radix)

使用第二个参数指定的基数,将字符串参数解析为有符号的整数。

examples from jdk:
parseint("0", 10) returns 0
parseint("473", 10) returns 473
parseint("-0", 10) returns 0
parseint("-ff", 16) returns -255
parseint("1100110", 2) returns 102
parseint("2147483647", 10) returns 2147483647
parseint("-2147483648", 10) returns -2147483648
parseint("2147483648", 10)throwsa numberformatexception
parseint("99",throwsa numberformatexception
parseint("kona", 10)throwsa numberformatexception
parseint("kona", 27)returns 411787

进制转换如何写(二,八,十六)不用算法
integer.tobinarystring
integer.tooctalstring
integer.tohexstring

然后是介绍java中的byte与十六进制数的转换

原理分析:

java中的byte是由8个bit组成的,而16进制即16中状态,它是由4个bit来表示的,因为24=16。所以我们可以把一个byte转换成两个用16进制字符,即把高4位和低4位转换成相应的16进制字符,并组合这两个16进制字符串,从而得到byte的16进制字符串。同理,相反的转换也是将两个16进制字符转换成一个byte。

在java中字节与十六进制的相互转换主要思想有两点:

1、二进制字节转十六进制时,将字节高位与0xf0做"&"操作,然后再左移4位,得到字节高位的十六进制a;将字节低位与0x0f做"&"操作,得到低位的十六进制b,将两个十六进制数拼装到一块ab就是该字节的十六进制表示。

2、十六进制转二进制字节时,将十六进制字符对应的十进制数字右移动4为,得到字节高位a;将字节低位的十六进制字符对应的十进制数字b与a做"|"运算,即可得到十六进制的二进制字节表示

其中一种转换的函数如下:

/** 
*  
* @param bytes 
* @return 将二进制转换为十六进制字符输出 
*/ </span>    private static string hexstr = "0123456789abcdef"; //全局
	   public static string binarytohexstring(byte[] bytes){  
   
  string result = "";  
  string hex = "";  
  for(int i=0;i<bytes.length;i++){  
    //字节高4位  
    <strong>hex = string.valueof(hexstr.charat((bytes[i]&0xf0)>>4)); </strong>
    //字节低4位  
   <strong>hex += string.valueof(hexstr.charat(bytes[i]&0x0f)); </strong> 
    result +=hex;  
  }  
  return result;  
	   }  
	   /** 
*  
* @param hexstring 
* @return 将十六进制转换为字节数组 
*/ 
	   public static byte[] hexstringtobinary(string hexstring){  
  //hexstring的长度对2取整,作为bytes的长度  
  int len = hexstring.length()/2;  
  byte[] bytes = new byte[len];  
  byte high = 0;//字节高四位  
  byte low = 0;//字节低四位  
	  
  for(int i=0;i<len;i++){  
    //右移四位得到高位  
    high = (byte)((hexstr.indexof(hexstring.charat(2*i)))<<4);  
    low = (byte)hexstr.indexof(hexstring.charat(2*i+1));  
    bytes[i] = (byte) (high|low);//高地位做或运算  
  }  
  return bytes;  
	   }  
	 } 

还有一种类似的方法:
    
<span style="font-size:14px;">* convert byte[] to hex string.这里我们可以将byte转换成int,然后利用integer.tohexstring(int)来转换成16进制字符串。 

* @param src byte[] data 
 * @return hex string 
 */   
public static string bytestohexstring(byte[] src){ 
  stringbuilder stringbuilder = new stringbuilder(""); 
  if (src == null || src.length <= 0) { 
    return null; 
  } 
  for (int i = 0; i < src.length; i++) { 
    int v = src[i] & 0xff; 
    string hv = integer.tohexstring(v); 
    if (hv.length() < 2) { 
      stringbuilder.append(0); 
    } 
    stringbuilder.append(hv); 
  } 
  return stringbuilder.tostring(); 
} 
/** 
 * convert hex string to byte[] 
 * @param hexstring the hex string 
 * @return byte[] 
 */ 
public static byte[] hexstringtobytes(string hexstring) { 
  if (hexstring == null || hexstring.equals("")) { 
    return null; 
  } 
  hexstring = hexstring.touppercase(); 
  int length = hexstring.length() / 2; 
  char[] hexchars = hexstring.tochararray(); 
  byte[] d = new byte[length]; 
  for (int i = 0; i < length; i++) { 
    int pos = i * 2; 
    d[i] = (byte) (chartobyte(hexchars[pos]) << 4 | chartobyte(hexchars[pos + 1])); 
  } 
  return d; 
} 
/** 
 * convert char to byte 
 * @param c char 
 * @return byte 
 */ 
 private byte chartobyte(char c) { 
  return (byte) "0123456789abcdef".indexof(c); 
} </span>

两种方式类似,这里注意下

上面是将byte[]转化十六进制的字符串,注意这里b[ i ] & 0xff将一个byte和 0xff进行了与运算,然后使用integer.tohexstring取得了十六进制字符串,可以看出

b[ i ] & 0xff运算后得出的仍然是个int,那么为何要和 0xff进行与运算呢?直接 integer.tohexstring(b[ i ]);,将byte强转为int不行吗?答案是不行的.

其原因在于:

1.byte的大小为8bits而int的大小为32bits
2.java的二进制采用的是补码形式

所以与负数&的时候负数会自动给补码补位1,这样就会有误差

而0xff默认是整形,所以,一个byte跟0xff相与会先将那个byte转化成整形运算,这样,结果中的高的24个比特就总会被清0,于是结果总是我们想要的。

还有一些网上总结的方法:

字符串转换成十六进制字符串方法1:

/** 
   * 字符串转换成十六进制字符串
   */ 
  public static string str2hexstr(string str) { 
    char[] chars = "0123456789abcdef".tochararray(); 
    stringbuilder sb = new stringbuilder("");
    byte[] bs = str.getbytes(); 
    int bit; 
    for (int i = 0; i < bs.length; i++) { 
      bit = (bs[i] & 0x0f0) >> 4; 
      sb.append(chars[bit]); 
      bit = bs[i] & 0x0f; 
      sb.append(chars[bit]); 
    } 
    return sb.tostring(); 
  } 

十六进制字符串转换成为数组方法1:

/**
  * 把16进制字符串转换成字节数组
  * @param hexstring
  * @return byte[]
  */
 public static byte[] hexstringtobyte(string hex) {
  int len = (hex.length() / 2);
  byte[] result = new byte[len];
  char[] achar = hex.tochararray();
  for (int i = 0; i < len; i++) {
  int pos = i * 2;
  result[i] = (byte) (tobyte(achar[pos]) << 4 | tobyte(achar[pos + 1]));
  }
  return result;
 }
 
 private static int tobyte(char c) {
  byte b = (byte) "0123456789abcdef".indexof(c);
  return b;
 }

数组转换成十六进制字符串方法1:

/**
 * 数组转换成十六进制字符串
 * @param byte[]
 * @return hexstring
 */
 public static final string bytestohexstring(byte[] barray) {
 stringbuffer sb = new stringbuffer(barray.length);
 string stemp;
 for (int i = 0; i < barray.length; i++) {
  stemp = integer.tohexstring(0xff & barray[i]);
  if (stemp.length() < 2)
  sb.append(0);
  sb.append(stemp.touppercase());
 }
 return sb.tostring();
 }

byte[]数组转换成十六进制字符串方法2:

/**
   * 数组转成十六进制字符串
   * @param byte[]
   * @return hexstring
   */
  public static string tohexstring1(byte[] b){
    stringbuffer buffer = new stringbuffer();
    for (int i = 0; i < b.length; ++i){
      buffer.append(tohexstring1(b[i]));
    }
    return buffer.tostring();
  }
  public static string tohexstring1(byte b){
    string s = integer.tohexstring(b & 0xff);
    if (s.length() == 1){
      return "0" + s;
    }else{
      return s;
    }
  }

十六进制字符串转换字符串方法1:

/**
 * 十六进制字符串转换成字符串
 * @param hexstring
 * @return string
 */
  public static string hexstr2str(string hexstr) { 

    string str = "0123456789abcdef"; 
    char[] hexs = hexstr.tochararray(); 
    byte[] bytes = new byte[hexstr.length() / 2]; 
    int n; 
    for (int i = 0; i < bytes.length; i++) { 
      n = str.indexof(hexs[2 * i]) * 16; 
      n += str.indexof(hexs[2 * i + 1]); 
      bytes[i] = (byte) (n & 0xff); 
    } 
    return new string(bytes); 
  }

十六进制字符串转换字符串方法2:

/**
   * 十六进制字符串转换字符串
   * @param hexstring
   * @return string
   */
 public static string tostringhex(string s) {
 byte[] bakeyword = new byte[s.length() / 2];
 for (int i = 0; i < bakeyword.length; i++) {
  try {
  bakeyword[i] = (byte) (0xff & integer.parseint(s.substring(
   i * 2, i * 2 + 2), 16));
  } catch (exception e) {
  e.printstacktrace();
  }
 }
 try {
  s = new string(bakeyword, "utf-8");// utf-16le:not
 } catch (exception e1) {
  e1.printstacktrace();
 }
 return s;
 }

以上这篇java中进制的转换,byte与16进制的转换方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。