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

java 解析8583 报文

程序员文章站 2022-07-12 21:56:28
...

首先 抽象一个类 表示每个域的数据

public class Area {
    private int areaNo;//域序号
    private String areaName;//域名称
    private int leng;//域长度(定长)
    private AreaDataType dataType;//域数据类型
    private AreaLenType lenType;//域长度类型
    private boolean isDynamicLen;//是否是变长
    private String data;//数据
    private int dynamicLen;//变长长度
    private int dynamicLen_2_3;//(变长长度是2/3字节)


    public Area() {
        super();
        // TODO Auto-generated constructor stub
    }

    public Area(int areaNo, String areaName, int leng, AreaDataType dataType, AreaLenType lenType,
            boolean isDynamicLen,int dynamicLen_2_3) {
        super();
        this.areaNo = areaNo;
        this.areaName = areaName;
        this.leng = leng;
        this.dataType = dataType;
        this.lenType = lenType;
        this.isDynamicLen = isDynamicLen;
        this.dynamicLen_2_3 = dynamicLen_2_3;
    }

    public int getDynamicLen_2_3() {
        return dynamicLen_2_3;
    }

    public void setDynamicLen_2_3(int dynamicLen_2_3) {
        this.dynamicLen_2_3 = dynamicLen_2_3;
    }

    public int getDynamicLen() {
        return dynamicLen;
    }

    public void setDynamicLen(int dynamicLen) {
        this.dynamicLen = dynamicLen;
    }

    public boolean isDynamicLen() {
        return isDynamicLen;
    }

    public void setDynamicLen(boolean isDynamicLen) {
        this.isDynamicLen = isDynamicLen;
    }

    public int getAreaNo() {
        return areaNo;
    }
    public void setAreaNo(int areaNo) {
        this.areaNo = areaNo;
    }
    public String getAreaName() {
        return areaName;
    }
    public void setAreaName(String areaName) {
        this.areaName = areaName;
    }
    public int getLeng() {
        return leng;
    }
    public void setLeng(int leng) {
        this.leng = leng;
    }
    public AreaDataType getDataType() {
        return dataType;
    }
    public void setDataType(AreaDataType dataType) {
        this.dataType = dataType;
    }
    public AreaLenType getLenType() {
        return lenType;
    }
    public void setLenType(AreaLenType lenType) {
        this.lenType = lenType;
    }
    public String getData() {
        return data;
    }
    public void setData(String data) {
        this.data = data;
    }

    @Override
    public String toString() {
        return "Area [areaNo=" + areaNo + ", areaName=" + areaName + ", leng=" + leng + ", dataType=" + dataType
                + ", lenType=" + lenType + ", data=" + data + "]";
    }
    
}

写两个枚举 一个表示该域的数据类型 一个表示数据长度类型

public enum AreaDataType {
    ASCII,
    BCD,
    BINARY
}


public enum AreaLenType {
    ASCII,
    BCD,
    BINARY
}

配置8583域的属性

public class BaoWenConfig {
    
    public  Area area0 = new Area(0, "msgtype", 4, AreaDataType.BCD, AreaLenType.BCD, false,0);
    public  Area area1 = new Area(1, "拓展位图", 8, AreaDataType.BINARY, AreaLenType.BCD, false,0);
    public  Area area2 = new Area(2, "主账号", 19, AreaDataType.BCD, AreaLenType.BCD, true,2);
    public  Area area3 = new Area(3, "交易处理码", 6, AreaDataType.BCD, AreaLenType.BCD, false,0);
    public  Area area4 = new Area(4, "交易金额", 12, AreaDataType.BCD, AreaLenType.BCD, false,0);
    public  Area area11 = new Area(11, "系统跟踪号", 6, AreaDataType.BCD, AreaLenType.BCD, false,0);
    public  Area area12 = new Area(12, "受卡发方所在地时间", 6, AreaDataType.BCD, AreaLenType.BCD, false,0);
    public  Area area13 = new Area(13, "受卡发方所在地日期", 4, AreaDataType.BCD, AreaLenType.BCD, false,0);
    public  Area area14 = new Area(14, "卡有效期", 4, AreaDataType.BCD, AreaLenType.BCD, false,0);
    public  Area area15 = new Area(15, "清算日期", 4, AreaDataType.BCD, AreaLenType.BCD, false,0);
    public  Area area22 = new Area(22, "服务点输入方式码", 3, AreaDataType.BCD, AreaLenType.BCD, false,0);
    public  Area area23 = new Area(23, "卡***", 3, AreaDataType.BCD, AreaLenType.BCD, false,0);
    public  Area area25 = new Area(25, "服务点条件码", 2, AreaDataType.BCD, AreaLenType.BCD, false,0);
    public  Area area26 = new Area(26, "服务点PIN获取码", 2, AreaDataType.BCD, AreaLenType.BCD, false,0);
    public  Area area32 = new Area(32, "受理机构标识码", 11, AreaDataType.BCD, AreaLenType.BCD, true,2);
    public  Area area35 = new Area(35, "第二磁道数据", 37, AreaDataType.BCD, AreaLenType.BCD, true,2);
    public  Area area36 = new Area(36, "第三磁道数据", 104, AreaDataType.BCD, AreaLenType.BCD, true,3);
    public  Area area37 = new Area(37, "检索参考号", 12, AreaDataType.ASCII, AreaLenType.BCD, false,0);
    public  Area area38 = new Area(38, "授权标识应答码", 6, AreaDataType.ASCII, AreaLenType.BCD, false,0);
    public  Area area39 = new Area(39, "应答码", 2, AreaDataType.ASCII, AreaLenType.BCD, false,0);
    public  Area area41 = new Area(41, "受卡机终端标识码", 8, AreaDataType.ASCII, AreaLenType.BCD, false,0);
    public  Area area42 = new Area(42, "受卡方标识码", 15, AreaDataType.ASCII, AreaLenType.BCD, false,0);
    public  Area area43 = new Area(43, "商户名称", 40, AreaDataType.ASCII, AreaLenType.ASCII, false,0);
    public  Area area44 = new Area(44, "附加响应数据", 25, AreaDataType.ASCII, AreaLenType.BCD, true,2);
    public  Area area48 = new Area(48, "附加数据-私有", 512, AreaDataType.BCD, AreaLenType.BCD, true,3);
    public  Area area49 = new Area(49, "交易货币代码", 3, AreaDataType.ASCII, AreaLenType.BCD, false,0);
    public  Area area52 = new Area(52, "个人标识码数据", 16, AreaDataType.BCD, AreaLenType.BCD, false,0);
    public  Area area53 = new Area(53, "安全控制信息", 16, AreaDataType.BCD, AreaLenType.BCD, false,0);
    public  Area area54 = new Area(54, "实际金额", 32, AreaDataType.ASCII, AreaLenType.BCD, true,3);
    public  Area area55 = new Area(55, "基于PBOC借贷记标准的IC卡数据", 255, AreaDataType.BINARY, AreaLenType.BCD, true,3);
    public  Area area57 = new Area(57, "pos版本", 42, AreaDataType.ASCII, AreaLenType.BCD, true,3);
    public  Area area58 = new Area(58, "基于PBOC电子钱包/存折IC卡标准的交易数据", 100, AreaDataType.BINARY, AreaLenType.BCD, true,3);
    public  Area area60 = new Area(60, "自定义域", 100, AreaDataType.BCD, AreaLenType.BCD, true,3);
    public  Area area61 = new Area(61, "原始信息域", 200, AreaDataType.BCD, AreaLenType.BCD, true,3);
    public  Area area62 = new Area(62, "原始信息域", 200, AreaDataType.BINARY, AreaLenType.BCD, true,3);
    public  Area area63 = new Area(63, "金融网络数据", 200, AreaDataType.ASCII, AreaLenType.BCD, true,3);
    public  Area area64 = new Area(64, "MAC", 8, AreaDataType.ASCII, AreaLenType.BCD, false,0);
    

    public  ArrayList<Area> areas = new ArrayList<Area>(){/**
         * 
         */
        private static final long serialVersionUID = 4868905912449475521L;
    {
        add(area0);
        add(area1);
        add(area2);
        add(area3);
        add(area4);
        add(area11);
        add(area12);
        add(area13);
        add(area14);
        add(area15);
        add(area22);
        add(area23);
        add(area25);
        add(area26);
        add(area32);
        add(area35);
        add(area36);
        add(area37);
        add(area38);
        add(area39);
        add(area41);
        add(area42);
        add(area43);
        add(area44);
        add(area48);
        add(area49);
        add(area52);
        add(area53);
        add(area54);
        add(area55);
        add(area57);
        add(area58);
        add(area60);
        add(area61);
        add(area62);
        add(area63);
        add(area64);
    }};
    
    
    public Area getAreaWithAreaNo(int no){
        Area result = null;
        for (Area area : areas) {
            if(area.getAreaNo() == no){
                result = area;
                break;
            }
        }
        return result;
    }
    
    
    
}

处理8583报文的主要类

import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.util.ArrayList;
import java.util.HashMap;
import javax.servlet.http.HttpServletRequest;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

public class Deal8583 {
    private static BASE64Encoder encoder = new BASE64Encoder();
    private static BASE64Decoder decoder = new BASE64Decoder();

    public static String byte2hex(byte[] b) // 二进制转字符串
    {
        String hs = "";
        String stmp = "";
        for (int n = 0; n < b.length; n++) {
            stmp = (java.lang.Integer.toHexString(b[n] & 0XFF));
            
            if (stmp.length() == 1){
                hs = hs + "0" + stmp;
            }
            else{
                hs = hs + stmp;
            }
        }
        return hs;
    }
    
    public static byte[] hex2byte(String str) { // 字符串转二进制
        if (str == null){
            return null;
        }
        str = str.trim();
        int len = str.length();
        if (len == 0 || len % 2 == 1){
            return null;
        }
        byte[] b = new byte[len / 2];
        try {for (int i = 0; i < str.length(); i += 2) {
            b[i / 2] = (byte) Integer.decode("0x" + str.substring(i, i + 2)).intValue();
        }
        return b;
        } catch (Exception e) {
            return null;
        }
    }

    public static String asciiToString(String value)  
    {  
        StringBuffer sbu = new StringBuffer();  
        String[] chars = value.split(",");  
        for (int i = 0; i < chars.length; i++) {  
            sbu.append((char) Integer.parseInt(chars[i]));  
        }  
        return sbu.toString();  
    }
    
    public static String stringToAscii(String value)  
    {  
        StringBuffer sbu = new StringBuffer();  
        char[] chars = value.toCharArray();   
        for (int i = 0; i < chars.length; i++) {  
            if(i != chars.length - 1)  
            {  
                sbu.append((int)chars[i]).append(",");  
            }  
            else {  
                sbu.append((int)chars[i]);  
            }  
        }  
        return sbu.toString();  
    }  
    
    public static String byteToASCString(byte[] bArray){
        String strASC="";
        String strTemp="";
        for(int i=0;i<bArray.length;i++){
            strTemp=String.format("%c",bArray[i]);
            strASC=strASC+strTemp;
        }
        return strASC;
    }

    /**
     * BASE64 编码
     * 
     * @param s
     * @return
     */
    public static String encodeBufferBase64(byte[] buff) {
        return buff == null ? null : encoder.encode(buff);
    }

    /**
     * BASE64解码
     * 
     * @param s
     * @return
     */
    public static byte[] decodeBufferBase64(String s) {
        try {
            return s == null ? null : decoder.decodeBuffer(s);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * BASE64 字节数组编码
     * 
     * @param s
     * @return String
     */
    public static String encodeBase64(byte[] s) {
        if (s == null)
            return null;
        String res = new BASE64Encoder().encode(s);
        res = res.replace("\n", "");
        res = res.replace("\r", "");
        return res;
    }

    /**
     * BASE64解码
     * 
     * @param s
     * @return
     */
    public static byte[] decodeBase64(byte[] buff) {
        if (buff == null)
            return null;
        BASE64Decoder decoder = new BASE64Decoder();
        try {
            byte[] b = decoder.decodeBuffer(new String(buff));

            return b;
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 将reauest里的数据包转成字符串
     * 
     * @param request
     * @return String
     */
    public static String getRequestBodyTxt(HttpServletRequest request) {
        // 接收手机传过来的参数
        BufferedInputStream bufferedInputStream = null;
        // 此类实现了一个输出流,其中的数据被写入一个字节数组
        ByteArrayOutputStream bytesOutputStream = null;
        String body = null;
        try {
            // BufferedInputStream 输入流
            bufferedInputStream = new BufferedInputStream(request.getInputStream());
            bytesOutputStream = new ByteArrayOutputStream();
            // 写入数据
            int ch;
            while ((ch = bufferedInputStream.read()) != -1) {
                bytesOutputStream.write(ch);
            }
            // 转换为String类型
            body = new String(bytesOutputStream.toByteArray(), "UTF-8");
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            // 关闭此输入流并释放与该流关联的所有系统资源。
            try {
                bytesOutputStream.flush();
                bytesOutputStream.close();
                bufferedInputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return body;
    }

    /**
     * 将reauest里的数据包转成字节数组
     * 
     * @param request
     * @return
     */
    public static byte[] getRequestBodyByte(HttpServletRequest request) {
        // 接收手机传过来的参数
        BufferedInputStream bufferedInputStream = null;
        // 此类实现了一个输出流,其中的数据被写入一个字节数组
        ByteArrayOutputStream bytesOutputStream = null;
        byte[] body = null;
        try {
            // BufferedInputStream 输入流
            bufferedInputStream = new BufferedInputStream(request.getInputStream());
            bytesOutputStream = new ByteArrayOutputStream();
            // 写入数据
            int ch;
            while ((ch = bufferedInputStream.read()) != -1) {
                bytesOutputStream.write(ch);
            }
            // 转换为String类型
            body = bytesOutputStream.toByteArray();
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            // 关闭此输入流并释放与该流关联的所有系统资源。
            try {
                bytesOutputStream.flush();
                bytesOutputStream.close();
                bufferedInputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return body;
    }

    public static String getEigthBitsStringFromByte(int b) {
        b |= 256; // mark the 9th digit as 1 to make sure the string
        String str = Integer.toBinaryString(b);
        int len = str.length();
        return str.substring(len - 8, len);
    }

    public static byte getByteFromEigthBitsString(String str) {
        byte b;
        if (str.substring(0, 1).equals("1")) {
            str = "0" + str.substring(1);
            b = Byte.valueOf(str, 2);
            b |= 128;
        } else {
            b = Byte.valueOf(str, 2);
        }
        return b;
    }

    /**
     * 将一个16字节数组转成128二进制数组
     * 
     * @param b
     * @return
     */
    public static boolean[] getBinaryFromByte(byte[] b) {
        boolean[] binary = new boolean[b.length * 8 + 1];
        String strsum = "";
        for (int i = 0; i < b.length; i++) {
            strsum += getEigthBitsStringFromByte(b[i]);
        }
        for (int i = 0; i < strsum.length(); i++) {
            if (strsum.substring(i, i + 1).equalsIgnoreCase("1")) {
                binary[i + 1] = true;
            } else {
                binary[i + 1] = false;
            }
        }
        return binary;
    }

    /**
     * 将一个128二进制数组转成16字节数组
     * 
     * @param binary
     * @return
     */
    public static byte[] getByteFromBinary(boolean[] binary) {

        int num = (binary.length - 1) / 8;
        if ((binary.length - 1) % 8 != 0) {
            num = num + 1;
        }
        byte[] b = new byte[num];
        String s = "";
        for (int i = 1; i < binary.length; i++) {
            if (binary[i]) {
                s += "1";
            } else {
                s += "0";
            }
        }
        String tmpstr;
        int j = 0;
        for (int i = 0; i < s.length(); i = i + 8) {
            tmpstr = s.substring(i, i + 8);
            b[j] = getByteFromEigthBitsString(tmpstr);
            j = j + 1;
        }
        return b;
    }

    /**
     * 将一个byte位图转成字符串
     * 
     * @param b
     * @return
     */
    public static String getStrFromBitMap(byte[] b) {
        String strsum = "";
        for (int i = 0; i < b.length; i++) {
            strsum += getEigthBitsStringFromByte(b[i]);
        }
        return strsum;
    }

    /**
     * bytes转换成十六进制字符串
     * 
     * @param b
     * @return
     */
    public static String byte2HexStr(byte[] b) {
        String hs = "";
        String stmp = "";
        for (int n = 0; n < b.length; n++) {
            stmp = (Integer.toHexString(b[n] & 0XFF));
            if (stmp.length() == 1)
                hs = hs + "0" + stmp;
            else
                hs = hs + stmp;
        }
        return hs.toUpperCase();
    }

    private static byte uniteBytes(String src0, String src1) {
        byte b0 = Byte.decode("0x" + src0).byteValue();
        b0 = (byte) (b0 << 4);
        byte b1 = Byte.decode("0x" + src1).byteValue();
        byte ret = (byte) (b0 | b1);
        return ret;
    }

    /**
     * 十六进制字符串转换成bytes
     * 
     * @param src
     * @return
     */
    public static byte[] hexStr2Bytes(String src) {
        int m = 0, n = 0;
        int l = src.length() / 2;
        byte[] ret = new byte[l];
        for (int i = 0; i < l; i++) {
            m = i * 2 + 1;
            n = m + 1;
            ret[i] = uniteBytes(src.substring(i * 2, m), src.substring(m, n));
        }
        return ret;
    }

    /**
     * 将String转成BCD码
     * 
     * @param s
     * @return
     */
    public static byte[] StrToBCDBytes(String s) {

        if (s.length() % 2 != 0) {
            s = "0" + s;
        }
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        char[] cs = s.toCharArray();
        for (int i = 0; i < cs.length; i += 2) {
            int high = cs[i] - 48;
            int low = cs[i + 1] - 48;
            baos.write(high << 4 | low);
        }
        return baos.toByteArray();
    }

    /**
     * 将BCD码转成int
     * 
     * @param b
     * @return
     */
    public static int bcdToint(byte[] b) {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < b.length; i++) {
            int h = ((b[i] & 0xff) >> 4) + 48;
            sb.append((char) h);
            int l = (b[i] & 0x0f) + 48;
            sb.append((char) l);
        }
        return Integer.parseInt(sb.toString());
    }

    // 将byte数组bRefArr转为一个整数,字节数组的低位是整型的低字节位
    public static int byteToInt(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;
    }
    
    /**
     * 向服务器 发送8583报文
     * 
     * @param send8583Str 发送给服务器的报文
     * 
     * @param host 主机地址IP
     * 
     * @param port 端口号
     * 
     * @return 返回的数据
     * */
    public static String send8583(String send8583Str,String host,int port) throws Exception{
        //客户端请求与本机在20011端口建立TCP连接 
        Socket client = new Socket(host, port);  
        client.setSoTimeout(70000);             
        //获取Socket的输出流,用来发送数据到服务端                  
        PrintStream out = new PrintStream(client.getOutputStream());          
        //获取Socket的输入流,用来接收从服务端发送过来的数据 
        InputStream buf =  client.getInputStream();  
        String str = "mpos-"+send8583Str;  
        //发送数据到服务端   
        out.println(str);  
        try{  
            byte[] b = new byte[1024];
            int rc=0;
            int c = 0;
            while( (rc = buf.read(b, c, 1024) )>=0){
                c = buf.read(b, 0, rc);
            }
            String returnStr = byte2hex(b);
            String string = returnStr;
            String str16 = string.substring(0, 4);
            int leng = Integer.parseInt(str16,16);
            String result = string.substring(0, leng*2 + 4);
            if (client!=null) {
                client.close();
            }
            return result;
        }catch(Exception e){ 
            e.printStackTrace();
            System.out.println("Time out, No response");  
        }
        if (client!=null) {
            client.close();
        }
       return null;
    }
    
    public static String bitmapHex2Binary(String bitmap){
        String bitMapStr =  bitmap;
        if (bitMapStr == null || bitMapStr.length() % 2 != 0)
            return null;
        String bString = "", tmp;
        for (int i = 0; i < bitMapStr.length(); i++)
        {
            tmp = "0000"
                    + Integer.toBinaryString(Integer.parseInt(bitMapStr
                            .substring(i, i + 1), 16));
            bString += tmp.substring(tmp.length() - 4);
        }
        return bString;
    }
    
    public static String getBitMapStr(String str8583){
        return str8583.substring(30, 46);
    }
    
    /**
     * 获得报文的位图数组
     * 
     * */
    public static ArrayList<Integer> getBitMap(String bitMapStr){
        ArrayList<Integer> bitMaps = new ArrayList<Integer>();
        if (bitMapStr == null || bitMapStr.length() % 2 != 0)
            return null;
        String bString = "", tmp;
        for (int i = 0; i < bitMapStr.length(); i++)
        {
            tmp = "0000"
                    + Integer.toBinaryString(Integer.parseInt(bitMapStr
                            .substring(i, i + 1), 16));
            bString += tmp.substring(tmp.length() - 4);
        }
        for(int i = 0 ; i < bString.length() ; i ++){
            char c = bString.charAt(i);
            int flag = Integer.parseInt(String.format("%c", c));
            if (flag==1) {
                bitMaps.add(i+1);
            }
        }
        return bitMaps;
    }

    /**
     * 解析8583报文
     * @param str8583 8583报文
     * @param resultMap 存放8583全部解析后的Map
     * @return 填充完成的域数组集合
     * 
     * */
    public static ArrayList<Area> jiexi8583(String str8583,HashMap<String, String> resultMap){
        
        //报文总长
        int currentIndex = 0;
        String lenStr = str8583.substring(currentIndex, 4);
        resultMap.put("LEN", lenStr);
        currentIndex += lenStr.length();
        
        //tpdu
        String TPDUStr = str8583.substring(currentIndex, currentIndex+10);
        resultMap.put("TPDU", TPDUStr);
        currentIndex += TPDUStr.length();
        
        //msghead
        String MSGHEADStr = str8583.substring(currentIndex,currentIndex+12);
        resultMap.put("MSGHEAD", MSGHEADStr);
        currentIndex += MSGHEADStr.length();
        
        //报文type
        String TYPEStr = str8583.substring(currentIndex, currentIndex+4);
        resultMap.put("TYPE", TYPEStr);
        currentIndex += TYPEStr.length();
        
        //位图
        String BITMAPStr = str8583.substring(currentIndex,currentIndex+16); 
        resultMap.put("BITMAP", BITMAPStr);
        currentIndex += BITMAPStr.length();
        
        //位图数组
        ArrayList<Integer> bitmaps = getBitMap(BITMAPStr);
        
        //报文配置
        BaoWenConfig config = new BaoWenConfig();
        //根据位图找到报文对应的域
        ArrayList<Area> areas = new ArrayList<Area>();
        for (Integer areaNo : bitmaps) {
            areas.add(config.getAreaWithAreaNo(areaNo));
        }
        //为每个域填充信息
        for (Area area : areas) {
            String areaDataStr = null;//用来存放该域的数据
            if( area.isDynamicLen()){//如果是变长的话
                if(area.getDataType()==AreaDataType.BCD && area.getLenType() == AreaLenType.BCD){
                    String dylenStr = null;
                    int useLen = 0;
                    if (area.getDynamicLen_2_3() == 2) {
                        dylenStr = str8583.substring(currentIndex,currentIndex+2);
                        currentIndex += 2;
                        int dataLen = Integer.parseInt(dylenStr);
                        if (dataLen %2 ==0) {
                            useLen = dataLen; 
                        }else{
                            useLen = dataLen + 1;
                        }
                    }else if(area.getDynamicLen_2_3() == 3){
                        dylenStr = str8583.substring(currentIndex,currentIndex+4);
                        currentIndex += 4;
                        int dataLen = Integer.parseInt(dylenStr);
                        if (dataLen %2 ==0) {
                            useLen = dataLen; 
                        }else{
                            useLen = dataLen + 1;
                        }
                    }
                    
                    areaDataStr = str8583.substring(currentIndex, currentIndex+useLen);
                    currentIndex += areaDataStr.length();
                    resultMap.put(String.format("%d", area.getAreaNo()), areaDataStr);
                    area.setLeng(Integer.parseInt(dylenStr));
                    
                }else if(area.getDataType()==AreaDataType.ASCII && area.getLenType() == AreaLenType.BCD){
                    String dylenStr = str8583.substring(currentIndex,currentIndex+4);
                    currentIndex += 4;
                    areaDataStr = str8583.substring(currentIndex, currentIndex+Integer.parseInt(dylenStr)*2);
                    currentIndex +=areaDataStr.length();
                    resultMap.put(String.format("%d", area.getAreaNo()), areaDataStr);
                    
                    area.setLeng(Integer.parseInt(dylenStr));
                    
                }else if(area.getDataType()==AreaDataType.BINARY && area.getLenType() == AreaLenType.BCD){
                    String dylenStr = str8583.substring(currentIndex,currentIndex+4);
                    currentIndex += 4;
                    areaDataStr = str8583.substring(currentIndex, currentIndex+Integer.parseInt(dylenStr)*2);
                    currentIndex +=areaDataStr.length();
                    resultMap.put(String.format("%d", area.getAreaNo()), areaDataStr);
                    area.setLeng(Integer.parseInt(dylenStr));
                }
            }else{//如果是固定长度
                if(area.getDataType()==AreaDataType.BCD && area.getLenType() == AreaLenType.BCD){
                    areaDataStr = str8583.substring(currentIndex,currentIndex+area.getLeng()); 
                    resultMap.put(String.format("%d", area.getAreaNo()) , areaDataStr);
                    currentIndex += areaDataStr.length() %2 ==0 ?areaDataStr.length():areaDataStr.length()+1 ;
                }else if(area.getDataType()==AreaDataType.ASCII && area.getLenType() == AreaLenType.BCD){
                    areaDataStr = str8583.substring(currentIndex,currentIndex+area.getLeng() * 2); 
                    resultMap.put(String.format("%d", area.getAreaNo()) , areaDataStr);
                    currentIndex += areaDataStr.length();
                }
            }
            //存放到该域
            area.setData(areaDataStr);
        }
        return areas;
    }
    
    public static void main(String[] args) throws Exception {
        String baowen = "012760000300006022000000000200702406C020C09A111662596543203269930000000000008890000006972212071000010012376259654320326993D2212201000007820000003130303030303132333034343532303438313230303031313536EF7F40420E3741FE260000000000000001649F26083AE8A83B8A54F8739F2701809F101307020103A00000010A0100000000008D9318249F3704E97798B59F3602017D950500000000009A031702219C01009F02060000008890005F2A02015682027C009F1A0201569F03060000000000009F3303E0E1C89F34030200009F3501229F1E0838373937303835378408A0000003330101029F090200309F4104000006979F6310303130353030303000000000000000000014220000020006013246373437303042";
        HashMap<String,String> resultMap = new HashMap<String, String>();
        ArrayList<Area> areas = jiexi8583(baowen,resultMap);
        System.out.println(resultMap);
        for (Area area : areas) {
            System.out.println(area);
        }
    }
}