进制数之间转化

来源:互联网 发布:淘宝主营类目在哪看 编辑:程序博客网 时间:2024/05/22 16:02

public class HexUtil {

 /**
  * 将指定字符串src,以每两个字符分割转换为16进制形式 如:"2B44EFD9" --> byte[]{0x2B, 0x44, 0xEF,
  * 0xD9}
  *
  * @param src
  *            String
  * @return byte[]
  */
 public static byte[] HexString2Bytes(String src) {
  byte[] ret = new byte[src.length() / 2];
  byte[] tmp = src.getBytes();
  for (int i = 0; i < src.length() / 2; i++) {
   ret[i] = uniteBytes(tmp[i * 2], tmp[i * 2 + 1]);
  }
  return ret;
 }

 /**
  * 将两个ASCII字符合成一个字节; 如:"EF"--> 0xEF
  *
  * @param src0
  *            byte
  * @param src1
  *            byte
  * @return byte
  */
 public static byte uniteBytes(byte src0, byte src1) {
  byte _b0 = Byte.decode("0x" + new String(new byte[] { src0 }))
    .byteValue();
  _b0 = (byte) (_b0 << 4);
  byte _b1 = Byte.decode("0x" + new String(new byte[] { src1 }))
    .byteValue();
  byte ret = (byte) (_b0 ^ _b1);
  return ret;
 }


 /**
  * 将指定byte数组以16进制的形式打印到控制台
  *
  * @param hint
  *            String
  * @param b
  *            byte[]
  * @return void
  */
 public static String printHexString(byte[] b) {
  StringBuffer returnValue = new StringBuffer();
  for (int i = 0; i < b.length; i++) {
   String hex = Integer.toHexString(b[i] & 0xFF);
   if (hex.length() == 1) {
    hex = '0' + hex;
   }
   returnValue.append(hex.toUpperCase() + "|");
  }
  return "[" + returnValue.toString() + "]";
 }

 /**
  * 计算校验和
  * @param src
  * @return
  */
 public static String checkSum(String src){
  int length = src.length();
  String sumString = null;
  for (int i = 0; i < length ; i=i+2) {
   sumString = sumHex(sumString,src.substring(i, i+2));
  }

  return sumString.substring(sumString.length()-2, sumString.length()).toUpperCase();
 }

 private static String sumHex(String src1,String src2){
  if(src1==null){
   return src2;
  }

  long x = Long.parseLong(src1, 16);
  long y = Long.parseLong(src2, 16);

  return Long.toHexString(x+y);
 }

 /**
  * 16进制数自增1
  * @param src
  * @return
  */
 public static String increase(String src) {
  if (src.equals(Const.STATE_OPEN) || Long.parseLong(src,16) >= 100) {
   return src;
  }
  long x = Long.parseLong(src,16);
  String tmp = Long.toHexString(x + 1).toUpperCase();
  if (tmp.length() == 1) {
   return "0" + tmp;
  }
  return tmp.substring(tmp.length()-2, tmp.length()).toUpperCase();
 }
 
 /**
  * 16进制数自减1
  * @param src
  * @return
  */
 public static String reduce(String src) {
  if (src.equals(Const.STATE_CLOSE) || Long.parseLong(src,16) <= 0) {
   return src;
  }
  long x = Long.parseLong(src,16);
  String tmp = Long.toHexString(x - 1).toUpperCase();
  if (tmp.length() == 1) {
   return "0" + tmp;
  }
  return tmp.substring(tmp.length()-2, tmp.length()).toUpperCase();
 }
}