bcd转换(bcd压缩展开)

首先先看一下这个ascii表
这里写图片描述

例如:

字符0,对应这个ascii表去找它对应的10进制数为48,
对它进行bcd压缩为:0011 0000 (48的二进制数)
对它进行bcd展开为:30 (48的十六进制数)

 /**
     * 字符串--->16进制
     * bcd展开
     * @param value
     *            
     * @return 16进制
     */
    private String StrToHex(String value)
    {
        if (value == null)
        {
            return "";
        }
        String str = "";
        byte[] btmp = value.getBytes();
        for (int i = 0; i < btmp.length; i++)
        {
            str = str + toHex(btmp[i]);
        }
        return str;
    }


 /**
     * 16进制--->字符串
     * 
     * @param hex
     *            16进制
     * @return 字符串
     */
    private static String HEX = "0123456789ABCDEF";

    private String HexToStr(String hex)
    {
        if (hex == null)
        {
            return "";
        }
        byte temp[] = _HexToBytes(hex);
        String result = new String(temp);
        return result;
    }
     private static byte[] _HexToBytes(String hex)
    {
        String _hex = hex.toUpperCase();
        byte[] result = new byte[hex.length() / 2];
        for (int i = 0; i < _hex.length() / 2; i++)
        {
            byte HH = (byte) (HEX.indexOf(_hex.substring(2 * i, 2 * i + 1)) << 4);
            byte HL = (byte) (HEX.indexOf(_hex.substring(2 * i + 1, 2 * i + 2)));
            result[i] = (byte) (HH | HL);
        }
        return result;
    }
public static void main(String[] args) {
String str="dummy000000000000000000000000000000000000000000000000000000000000000000000000000000000000000052000333F23003001F552909f2608a78fe2dff1b964039f2701809f101307000103a0a802010a01000008878045f1f9f09f37046c3e54b49f360207b9950500800408009a031611029c01009f02060000000000015f2a02015682027c009f1a0201569f03060000000000009f33036040c89f34030203009f3501229f1e0835303835343334338408a0000003330101029f090200209f410400000000F600130000000000060F22003052063T01003M35T02032S3M357PXD3-028508543430000000000T03010M20160822aAAAA";

        String hex =StrToHex(str);
        System.out.println("StrToHex=="+hex);
//bcd展开:打印结果:StrToHex==64756D6D793030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303035323030303333334632333030333030314635353239303966323630386137386665326466663162393634303339663237303138303966313031333037303030313033613061383032303130613031303030303038383738303435663166396630396633373034366333653534623439663336303230376239393530353030383030343038303039613033313631313032396330313030396630323036303030303030303030303031356632613032303135363832303237633030396631613032303135363966303330363030303030303030303030303966333330333630343063383966333430333032303330303966333530313232396631653038333533303338333533343333333433333834303861303030303030333333303130313032396630393032303032303966343130343030303030303030463630303133303030303030303030303036304632323030333035323036335430313030334D333554303230333253334D333537505844332D3032383530383534333433303030303030303030305430333031304D32303136303832326141414141

        String strs=Charset.HexToStr(hex1);

        System.out.println("Charset.HexToStr=="+strs);
        //打印结果:HexToStr==dummy000000000000000000000000000000000000000000000000000000000000000000000000000000000000000052000333F23003001F552909f2608a78fe2dff1b964039f2701809f101307000103a0a802010a01000008878045f1f9f09f37046c3e54b49f360207b9950500800408009a031611029c01009f02060000000000015f2a02015682027c009f1a0201569f03060000000000009f33036040c89f34030203009f3501229f1e0835303835343334338408a0000003330101029f090200209f410400000000F600130000000000060F22003052063T01003M35T02032S3M357PXD3-028508543430000000000T03010M20160822aAAAA

        if(str.equals(strs)){
            System.out.println("str==strs");
            //str==strs
        }


}

    /** 
     * @功能: 10进制串转为BCD码 
     * @参数: 10进制串  String
     * @结果: BCD码  byte[]
     * 
     * 
     */  
    public static byte[] decimal‎2Bcd(String decimal) {  
        int len = decimal.length();  
        int mod = len % 2;  
        if (mod != 0) {  
            decimal = "0" + decimal;  
            len = decimal.length();  
        }  
        byte abt[] = new byte[len];  
        if (len >= 2) {  
            len = len / 2;  
        }  
        byte bbt[] = new byte[len];  
        abt = decimal.getBytes();  
        int j, k;  
        for (int p = 0; p < decimal.length() / 2; p++) {  
            if ((abt[2 * p] >= '0') && (abt[2 * p] <= '9')) {  
                j = abt[2 * p] - '0';  
            } else if ((abt[2 * p] >= 'a') && (abt[2 * p] <= 'z')) {  
                j = abt[2 * p] - 'a' + 0x0a;  
            } else {  
                j = abt[2 * p] - 'A' + 0x0a;  
            }  
            if ((abt[2 * p + 1] >= '0') && (abt[2 * p + 1] <= '9')) {  
                k = abt[2 * p + 1] - '0';  
            } else if ((abt[2 * p + 1] >= 'a') && (abt[2 * p + 1] <= 'z')) {  
                k = abt[2 * p + 1] - 'a' + 0x0a;  
            } else {  
                k = abt[2 * p + 1] - 'A' + 0x0a;  
            }  
            int a = (j << 4) + k;  
            byte b = (byte) a;  
            bbt[p] = b;  
        }  
        return bbt;  
    }  

    /** 
     * @功能: BCD码转为10进制串(阿拉伯数据) 
     * @参数: BCD码 
     * @结果: 10进制串 
     * 
     * 例如:“11”---> 3131
     */  
    public static String bcd2Str(byte[] bytes) {  
        StringBuffer temp = new StringBuffer(bytes.length * 2);  
        for (int i = 0; i < bytes.length; i++) {  
            temp.append((byte) ((bytes[i] & 0xf0) >>> 4));  
            temp.append((byte) (bytes[i] & 0x0f));  
        }  
        return temp.toString().substring(0, 1).equalsIgnoreCase("0") ? temp  
                .toString().substring(1) : temp.toString();  
    }  
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值