DP判断取几多字节根据银联
DP判断取多少字节根据银联
/** * */ package com.icitic.iccard.dp.test; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import java.util.Scanner; /** * 运算规则和0x1f做与运算来确定是取得几个字节 用第一个字节和后面0x1f取值 若和0x1f与操作后,还等于0x1f则取两个字节,取2个字节(4位)即可 ,数据都是16进制文件,取前(两位)做为一个字节 template.dat的文件如下: X00401|827C00|8701|9F360000|9F080020|9F5680|9F130000|9F4D0B0A|9F4F9A039F21039F02069F03069F1A025F2A029F4E149C019F3602|8C9F02069F03069F1A0295055F2A029A039C019F37049F21039F4E14|8D8A029F02069F03069F1A0295055F2A029A039C019F37049F21039F4E14|9F2700|9F0E0010980000|9F0FD86804F800|9F0DD86004A800|9F1007800103000000010A01|5F280156|5F2Dzh|9F510156|4FA000000333010101|50PBOC DEBIT|9F07FF00|8E000000000000000002031F00|9F499F3704|9F52C000| |5F300220| |X0035F24,5A,5F34,9F07,8E,9F0D,9F0E,9F0F,5F28,82|9F63|9F4A82&X00402|9F389F7A019F02065F2A02|8E00000000000000005E031F00|9F0E0010800000|9F0FD8683CF800|9F0DD8603CA800&X00403|827C00|9F389F66049F02069F03069F1A0295055F2A029A039C019F3704|9F6881400000|9F6C0000|9F1007800103000000010A01| * @author sandy * */ public class FetchDPDataTag { //private static final String _FILENAME = "text.dat"; /** * text.dat(发卡行数据)文件的内容如下: * X00401|5A6217661199000000814|5F3400|9F5300|9F54000000000000|9F5C000000000000|9F5800|9F5900|9F1400|9F2300|5F20|9F0B|9F61|9F6200|5F24161231|5F25110321| |9F1F|57A2A2AC4DF6D286F91ED9A6961628D77093400DF06DA2A9CA8F01517F6690D849FB348F4B564D40C5&X00402|9F79000000000000|9F77000000100000|9F74ECC001|9F78000000100000|9F6D000000000000&X00403|9F6B000000999999|9F5D000000000001 */ private static final String _TEMPLATEFILENAME = "template.dat"; private static final String _SEPARATOR = "\\|"; /** * @param args */ public static void main(String[] args) { start(); } private static void start() { InputStream is = FetchDPDataTag.class.getClassLoader().getResourceAsStream( _TEMPLATEFILENAME); Scanner scanner = new Scanner(is, "utf-8"); List<String> differents = new ArrayList<String>(); List<String> sames = new ArrayList<String>(); while (scanner.hasNextLine()) { parse(scanner, differents, sames); } } private static void parse(Scanner scanner, List<String> differents, List<String> sames) { String line = scanner.nextLine(); String[] tagsAndValues = line.split(_SEPARATOR); for (String tagAndValus : tagsAndValues) { if (tagAndValus.trim()!=null&&tagAndValus.trim().length()!=0) { boolean b = tagAndValus.startsWith("X00"); if (!b) { String he2 = tagAndValus.substring(0, 2); int i = Integer.parseInt(he2, 16); if ((i & 0x1f) == 0x1f) { String key = tagAndValus.substring(0, 4); distribute(differents, sames, key); System.out.println("2个字节key===" + key); } else { String key = tagAndValus.substring(0, 2); distribute(differents, sames, key); System.out.println("1个字节key===" + key); } } } } printrepeatTag(sames); print_unrepeatTag(differents); } /** * 打印不重复的tag * @param differents */ private static void print_unrepeatTag(List<String> differents) { for (String diff : differents) { // System.out.println("不重复的tag==========="+diff); System.out.println(diff); } } /** * 打印重复的tag * @param sames */ private static void printrepeatTag(List<String> sames) { for (String sametag : sames) { System.out.println("重复的tag============="+sametag); } } /** * 分发数据 * @param differents * @param sames * @param key */ private static void distribute(List<String> differents, List<String> sames, String key) { if(differents.contains(key)){ sames.add(key); }else{ differents.add(key); } } }