美文网首页
Android IC卡读写卡 RFID NFC BCC异或和校

Android IC卡读写卡 RFID NFC BCC异或和校

作者: mapleSeriesX | 来源:发表于2020-09-08 16:32 被阅读0次
    package com.maple.demo.serialport;
    
    import android.util.Log;
    
    /**
     * Created by maple on 2020-09-08 11:03
     * E-Mail Address:740917401@qq.com
     */
    public class BinaryHexUtils {
    
    
        /**
         * 获取两位16进制字符串的反码
         *
         * @param hexString 两位16进制字符串 8bit
         * @return 两位16进制字符串的反码
         */
        public static String getHexReverse(String hexString) {
            String ss = "0123456789ABCDEF";
            char[] ch = hexString.toCharArray();
            for (int i = 0; i < ch.length; i++) {
                if (!ss.contains(String.valueOf(ch[i]).toUpperCase())) {
                    Log.e("getHexReverse", "输入的16进制是错误的");
                    return hexString;
                }
            }
            int x = Integer.valueOf(hexString, 16);//16进制转化为10进制
            String y = Integer.toBinaryString(x);//将x转化为二进制
            StringBuffer sb = new StringBuffer();
            int size = hexString.length() * 4;//16进制 1位等于 2进制 4位  例如:f == 1111 4倍
            //如果位数不够 ,在前面补零
            for (int i = 0; i < size - y.length(); i++) {
                sb.append("0");
            }
            sb.append(y);
            char[] c = sb.toString().toCharArray();
            StringBuffer sb1 = new StringBuffer();
            for (int i = 0; i < c.length; i++) {
                sb1.append((c[i] == '0' ? 1 : 0));
            }
            int z = Integer.valueOf(sb1.toString(), 2);//2进制转化为10进制
            String result = Integer.toHexString(z).toUpperCase();
            //如果位数不够 ,在前面补零
            int resultLength = result.length();
            for (int i = 0; i < hexString.length() - resultLength; i++) {
                result = "0" + result;
            }
            Log.e("getHexReverse", "[2进制 原码:" + sb.toString() + " 反码:" + sb1.toString() + "] " +
                    "[16进制 原码:" + hexString + " 反码:" + result + "]");
            return result;
        }
    
    
        /**
         * 获取BCC异或和校验值(异或校验法)
         *
         * @param hexString hex字符串
         * @return BCC异或和校验值(两位16进制字符串)
         */
        public static String getXorSum(String hexString) {
            hexString = changeToTwoBitHex(hexString);
            String[] b = hexString.split(" ");
            int a = 0;
            for (int i = 0; i < b.length; i++) {
                a = a ^ Integer.parseInt(b[i], 16);
            }
            if (a < 10) {
                StringBuffer sb = new StringBuffer();
                sb.append("0");
                sb.append(a);
                return sb.toString();
            }
            return Integer.toHexString(a);
        }
    
        /**
         * 用空格隔开每两位16进制值
         *
         * @param hexString hex字符串
         * @return hex字符串
         */
        public static String changeToTwoBitHex(String hexString) {
            String str = "";
            for (int i = 0; i < hexString.length(); i++) {
                if (i % 2 == 0) {
                    str += " " + hexString.substring(i, i + 1);
                } else {
                    str += hexString.substring(i, i + 1);
                }
            }
            return str.trim();
        }
    
        /**
         * Hex字符串转成字符串
         *
         * @param hexString Hex字符串
         * @return 字符串
         */
        public static String hexStringToString(String hexString) {
            if (hexString == null || hexString.equals("")) {
                return null;
            }
            hexString = hexString.replace(" ", "");
            byte[] baKeyword = new byte[hexString.length() / 2];
            for (int i = 0; i < baKeyword.length; i++) {
                try {
                    baKeyword[i] = (byte) (0xff & Integer.parseInt(hexString.substring(i * 2, i * 2 + 2), 16));
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            try {
                hexString = new String(baKeyword, "UTF-8");
                new String();
            } catch (Exception e1) {
                e1.printStackTrace();
            }
            return hexString;
        }
    
        /**
         * 字符串转成Hex字符串
         *
         * @param string 字符串
         * @return Hex字符串
         */
        public static String stringToHexString(String string) {
    
            char[] chars = string.toCharArray();
    
            StringBuffer hex = new StringBuffer();
            for (int i = 0; i < chars.length; i++) {
                hex.append(Integer.toHexString((int) chars[i]));
            }
    
            return hex.toString();
        }
    
    
        /**
         * Hex字符串转成byte数组
         * Hex长度为奇数最后一个字符会被舍去
         *
         * @param hexString Hex字符串
         * @return byte数组
         */
        public static byte[] hexStringToBytes(String hexString) {
            if (hexString.length() < 1) {
                return null;
            } else {
                byte[] result = new byte[hexString.length() / 2];
                int j = 0;
                for (int i = 0; i < hexString.length(); i += 2) {
                    result[j++] = (byte) Integer.parseInt(hexString.substring(i, i + 2), 16);
                }
                return result;
            }
        }
    }
    
    

    相关文章

      网友评论

          本文标题:Android IC卡读写卡 RFID NFC BCC异或和校

          本文链接:https://www.haomeiwen.com/subject/rfhjektx.html