8583 55

原创 2015年11月20日 17:53:33
public class Field55Test {
 
    private static final String LINE_SP = System.getProperty("line.separator");
    //测试报文55域
    public static final byte[] BYTES = new byte[] { (byte) 0x9F, 0x10, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
            0x00, (byte) 0x9A, 0x03, 0x11,
            0x12,
            0x08, //
            (byte) 0x9C, 0x01, 0x00, (byte) 0x9F, 0x02, 0x06, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x5F, 0x2A,
            0x02,
            0x01, //
            0x11, 0x71, (byte) 0x81, (byte) 0xC8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
            0x00, //
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
             
    //获取55域中的TAG
    private static byte[] getTag(int index, byte[] source) {
        byte tag1 = source[index];
        if ((tag1 & 0x1f) == 0x1f) {
            return new byte[] { source[index], source[index + 1] };
        } else {
            return new byte[] { source[index] };
        }
    }
    //获取域名中得TAG长度
    private static byte[] getLen(int index, byte[] source) {
        byte len1 = source[index];
        if ((len1 & 0x80) == 0x00) {
            return new byte[] { source[index] };
        } else {
            byte len2 = (byte) (len1 & 0x7f);
            len2++;
            byte[] len = new byte[len2];
            System.arraycopy(source, index, len, 0, len2);
            return len;
        }
    }
    //获取55域中得TAG值
    private static byte[] getValue(int index, byte[] source, int len) {
        byte[] value = new byte[len];
        System.arraycopy(source, index, value, 0, len);
        return value;
    }
 
    static void printHex(byte[] bytes) {
        String info = "";
        for (int i = 0; i < bytes.length; i++) {
            String s = Integer.toHexString(bytes[i] < 0 ? bytes[i] + 256 : bytes[i]);
            if (s.length() == 1) {
                s = "0" + s;
            }
            info += s;
            info += " ";
            if ((i + 1) % 16 == 0) {
                info += LINE_SP;
            }
        }
        System.out.print(info);
    }
 
    /**
     * @param args
     */
    public static void main(String[] args) {
        int index = 0;
        //循环读取所有TAG
        while (index < BYTES.length) {
            byte[] tag = getTag(index, BYTES);
            index += tag.length;
            byte[] len = getLen(index, BYTES);
            index += len.length;
            int iLen;
            if (len.length == 1) {
                iLen = len[0];
            } else {
                iLen = len[1] < 0 ? len[1] + 256 : len[1];
            }
            byte[] val = getValue(index, BYTES, iLen);
            index += val.length;
            System.out.print("tag:");
            printHex(tag);
            System.out.print("len:");
            printHex(len);
            System.out.print("val:");
            printHex(val);
            System.out.println();
        }
    }
}


/** 
 * 银联55域 
 *  
 * 本域将根据不同的交易种类包含不同的子域。银联处理中心仅在受理方和发卡方之间传递这些适用于IC卡交易的特有数据,而不对它们进行任何修改和处理。 
 * 为适应该子域需要不断变化的情况 
 * ,本域采用TLV(tag-length-value)的表示方式,即每个子域由tag标签(T),子域取值的长度(L)和子域取值(V)构成。 
 * tag标签的属性为bit 
 * ,由16进制表示,占1~2个字节长度。例如,"9F33"为一个占用两个字节的tag标签。而"95"为一个占用一个字节的tag标签 
 * 。若tag标签的第一个字节 
 * (注:字节排序方向为从左往右数,第一个字节即为最左边的字节。bit排序规则同理。)的后五个bit为"11111",则说明该tag占两个字节 
 * ,例如"9F33";否则占一个字节,例如"95"。 子域长度(即L本身)的属性也为bit,占1~3个字节长度。具体编码规则如下: a) 
 * 当L字段最左边字节的最左bit位(即bit8)为0,表示该L字段占一个字节,它的后续7个bit位(即bit7~bit1)表示子域取值的长度, 
 * 采用二进制数表示子域取值长度的十进制数 
 * 。例如,某个域取值占3个字节,那么其子域取值长度表示为"00000011"。所以,若子域取值的长度在1~127 
 * 字节之间,那么该L字段本身仅占一个字节。 b) 
 * 当L字段最左边字节的最左bit位(即bit8)为1,表示该L字段不止占一个字节,那么它到底占几个字节由该最左字节的后续7个bit位 
 * (即bit7~bit1)的十进制取值表示。例如,若最左字节为10000010,表示L字段除该字节外,后面还有两个字节。其后续字节 
 * 的十进制取值表示子域取值的长度。例如,若L字段为"1000 0001 1111 1111",表示该子域取值占255个字节。 
 * 所以,若子域取值的长度在128~255字节之间,那么该L字段本身需占两个字节 
 *  
 */


java解析8583报文55域

java解析8583报文55域,java解析8583报文IC卡数据域
  • xiaoqiaoi5685
  • xiaoqiaoi5685
  • 2016年05月19日 18:29
  • 2857

8583报文手动组包——详细分析每个示范域

8583报文作为一种应用较广的报文,有它独特的格式。 网上有关8583报文的说明很多。但涉及到每个域的详细例子就较少了。这里列出各个域的详细例子,供参考。 8583报文: 报文组成: ...
  • yangzhaomuma
  • yangzhaomuma
  • 2015年12月24日 19:54
  • 6474

手工解包 8583报文

首先了解8583协议机构
  • lixld
  • lixld
  • 2014年08月13日 18:49
  • 1297

深入理解8583协议

最初,金融系统只有IBM这些大公司来提供设备,象各种主机与终端等,后来有很多大大小小的公司进入,怎样设计一个报文协议,解决各公司金融系统之间的报文交换,暂且称该协议叫做ISO8583协议。例如‘回头客...
  • xwq2324
  • xwq2324
  • 2016年03月23日 13:39
  • 1350

8583报文 55域JAVA的解析

银联55域 :            本域将根据不同的交易种类包含不同的子域。银联处理中心仅在受理方和发卡方之间传递这些适用于IC卡交易的特有数据,而不对它们进行任何修改和处理。  为适应该子域需要...
  • qq_23053701
  • qq_23053701
  • 2015年03月27日 15:53
  • 942

C解析8583报文55域

C语言解析8583报文55域
  • xiaoqiaoi5685
  • xiaoqiaoi5685
  • 2016年05月19日 18:43
  • 1980

谈谈8583报文的使用及测试

ISO8583报文在金融行业可谓是声名显赫,8583报文是一个国际标准的包格式,其重要性阿堂就不用多说了,网上有很多的介绍,不过对于一个从未接触过8383报文的新手来说,还是很有难度的。它主要是用来解...
  • Night_SaaS
  • Night_SaaS
  • 2017年03月16日 15:15
  • 526

ISO8583报文工具类(组装和解析报文)

很久没来csdn了。现在的工作地点在银行,妈的,不让上网啊。 写写博客其实是对自己知识的总结,这么长时间了,也该写点东西了。接触银行的项目,避免不了 遇上8583报文。具体介绍就不细讲了,这个网上一大...
  • lushuaiyin
  • lushuaiyin
  • 2013年11月06日 21:00
  • 11111

ISO8583报文128个域说明

(转载)ISO8583报文128个域说明 博客分类: Pos应用 iso8583128域  ISO8583包(简称8583包)是一个国际标准的包格式,最多由128个字...
  • down177
  • down177
  • 2015年06月03日 10:11
  • 2032

银联常用8583报文域说明--个人整理20160322

位 域名定义 属性 格式 压缩类型 说明 0 消息类型 N4 BCD 4个字节的定长数字字符域。压缩时用BCD码表示的2个字节的定长域。 1 位图 B64 ...
  • u014720700
  • u014720700
  • 2016年03月22日 11:05
  • 6308
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:8583 55
举报原因:
原因补充:

(最多只允许输入30个字)