一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

java Socket获取十六进制数据转整数和字符串

时间:2016-08-22 编辑:简简单单 来源:一聚教程网

最近在开发中使用到java对接一个体温检测设备,业务是用过扫描二维码确认身份,然后检测体温,最后提交到服务器,过程中使用到了十六进制字符串和整数、字符串、汉字等之间的互相转换。

socket接收代码:

 代码如下 复制代码

InputStream input = null;
 
 
public void run() {
        System.out.println("1111111111111111111111111111111111111111111111111111111");
        try {
        // 采用循环不断从Socket中读取客户端发过来的数据
        boolean done=true;
                    try {
                        byte[] buf = new byte[100];
                        int len = 0;
                        int serial=1;
                        while ((len = input.read(buf)) != -1) {
                        {
                        byte[] type={buf[4]};
                        String a=ByteUtil.printHexString(type);
                        System.out.println("消息类型"+a);
                        try {
                        switch (a) {
                        case "02":
                        tiWenService.doTiWen(buf,socket,serial);//体温信息
                        break;
                        case "03"://获取二维码所对应的姓名
                        tiWenService.getChild(buf,socket,serial);
                        break;
                        case "01"://设备启动信息
                        tiWenService.startUp(buf,socket,serial);
                        default:
                        break;
                        
                        }
                        serial++;
                        } catch (Exception e) {
                        e.printStackTrace();
                        }
                        }
           
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


接着分享一下转换代码:

 

 代码如下 复制代码
public static int bytesToInt(byte[] bRefArr) {
    int iOutcome = 0;
    byte bLoop;
 
    for (int i = 0; i < bRefArr.length; i++) {
        bLoop = bRefArr[i];
        iOutcome += (bLoop & 0xFF) << (8 * i);
    }
    return iOutcome;
}
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数字转字符串
public static String printHexString(byte[] b) {
    String hexs = "";
    for (int i = 0; i < b.length; i++) {
 
        String hex = Integer.toHexString(b[i] & 0xFF);
        if (hex.length() == 1) {
            hex = '0' + hex;
        }
        hexs += hex;
 
    }
    return hexs;
}
 
/*
 * 16进制字符串转整形
 */
public static int OxStringtoInt(String ox) throws Exception {
    ox = ox.toLowerCase();
    if (ox.startsWith("0x")) {
        ox = ox.substring(2, ox.length());
    }
    Integer ri = 0;
    Integer oxlen = ox.length();
    for (int i = 0; i < oxlen; i++) {
        char c = ox.charAt(i);
        int h;
        if (('0' <= c && c <= '9')) {
            h = c - 48;
        } else if (('a' <= c && c <= 'f')) {
            h = c - 87;
 
        } else if ('A' <= c && c <= 'F') {
            h = c - 55;
        } else {
            throw (new Exception("not a integer "));
        }
        byte left = (byte) ((oxlen - i - 1) * 4);
        ri |= (h << left);
    }
    return ri;
 
}
 
// 16进制转字符串
public static String hexString2String(String src) {
    String temp = "";
    for (int i = 0; i < src.length() / 2; i++) {
        temp = temp
                + (char) Integer.valueOf(src.substring(i * 2, i * 2 + 2),
                        16).byteValue();
    }
    return temp;
}
 
// 整数转byte数组
public static byte[] intTobytes(int var) {
    byte[] b = new byte[2];
    // b[0]=(byte)(var>>24);
    // b[1]=(byte)(var>>16);
    // b[2]=(byte)(var>>8);
    // b[3]=(byte)(var);
    b[0] = (byte) (var >> 8);
    b[1] = (byte) (var);
    return b;
}
 
/**
  * 生成16进制累加和校验码
  *
  * @param data 除去校验位的数据
  * @return
  */
 public static String makeChecksum(String data) {
     if (StringUtils.isEmpty(data)) {
         return "";
     }
     int total = 0;
     int len = data.length();
     int num = 0;
     while (num < len) {
         String s = data.substring(num, num + 2);
         total += Integer.parseInt(s, 16);
         num = num + 2;
     }
     /**
      * 用256求余最大是255,即16进制的FF
      */
     int mod = total;
     String hex = Integer.toHexString(mod & 0xFF);
     len = hex.length();
     //如果不够校验位的长度,补0,这里用的是两位校验
     if (len < 2) {
         hex = "0" + hex;
     }
     return hex;
 }
 /**
   * 16进制字符串转换成byte数组
   * @param 16进制字符串
   * @return 转换后的byte数组
   */ 
    public static byte[] hex2Byte(String hex) { 
    String digital = "0123456789ABCDEF"; 
    char[] hex2char = hex.toCharArray(); 
    byte[] bytes = new byte[hex.length() / 2]; 
    int temp; 
    for (int i = 0; i < bytes.length; i++) { 
    // 其实和上面的函数是一样的 multiple 16 就是右移4位 这样就成了高4位了 
    // 然后和低四位相加, 相当于 位操作"|"  
    //相加后的数字 进行 位 "&" 操作 防止负数的自动扩展. {0xff byte最大表示数} 
        temp = digital.indexOf(hex2char[2 * i]) * 16; 
        temp += digital.indexOf(hex2char[2 * i + 1]); 
        bytes[i] = (byte) (temp & 0xff); 
    } 
    return bytes; 
}

热门栏目