java 封装和解析报文_IS08583报文协议包的解析和封装java源代码

转自:http://www.cnblogs.com/dengzhaozhe/archive/2009/05/09/1453251.html

前段时间做了一个涉及到IS08583报文协议的项目,自己总结写了这篇附有java源代码的文章,希望能给大家提供一些帮助,本文分四个部分介绍IS08583报文协议包的处理及如何解析请求包及怎样封装返回包,

一:IS08583包介绍:

ISO8583包(简称8583包)是一个国际标准的包格式,最多由128个字段域组成,每个域都有统一的规定,并有定长与变长之分。

8583包前面一段为位图,用来确定包的字段域组成情况。其中位图是8583包的灵魂,它是打包解包确定字段域的关键, 而了解每个字段域的属性则是填写数据的基础。

1:位图说明:

位置:在8583包的第1 位

格式:定长

类型:B16(二进制16位,16*8=128bit)

描述:

如将位图的第一位设为'1',表示使用扩展位图(128个域),否则表示只使用基本位图(64个域)。

如使用某数据域,应在位图中将相应的位设位'1',如使用41域,需将位图的41位设为'1'。

选用条件:如使用65到128域,需设位图域第一位为'1'

2:域的定义:

typedef struct ISO8583

{

int bit_flag;            /*域数据类型0 -- string, 1 -- int, 2 -- binary*/

char *data_name;  /*域名*/

int length;             /*数据域长度*/

int length_in_byte;/*实际长度(如果是变长)*/

int variable_flag;   /*是否变长标志0:否 2:2位变长, 3:3位变长*/

int datatyp;         /*0 -- string, 1 -- int, 2 -- binary*/

char *data;         /*存放具体值*/

int attribute;      /*保留*/

} ISO8583;

二:定义BitMap类

类说明:根据ISO8583 包的域定义,定义BitMap类存储每个域的信息。例如:

package com.lottery.pos.model;

public  class BitMap {

private int bit; //位

private int bittype; //数据类型 1 ascii 2 binary

private int variable;  //是否变长0 不是 2 两位变长 3 三位变长

private int len; //数据长度

private byte[] dat; //数据

public int getBit() {

return bit;

}

public void setBit(int bit) {

this.bit = bit;

}

public int getBittype() {

return bittype;

}

public void setBittype(int bittype) {

this.bittype = bittype;

}

public int getVariable() {

return variable;

}

public void setVariable(int variable) {

this.variable = variable;

}

public byte[] getDat() {

return dat;

}

public void setDat(byte[] dat) {

this.dat = dat;

}

public int getLen() {

return len;

}

public void setLen(int len) {

this.len = len;

}

}

三:定义PortConfig类

类说明:定义配置信息类。根据此类解析和封装数据。例如:

package com.lottery.pos.model;

public class PortConfig {

/**

* 存放所有接口的配置信息

* [][0] bit     位:在Map中的位

* [][1] type   类型:1 ascii 2 binary

* [][2] len    长度:(对定长有效)

* [][3] varLen 变长:0非变长 2位变长 3位变长

*/

// 定义一个二位数组存放配置信息。

public static final  int[][] config= {

{11,1,6,0},

{12,1,6,0},

{13,1,4,0},

{32,1,11,0},

{37,1,12,0},

{39,1,2,0},

{40,2,50,2},

{41,1,8,0},

{48,1,52,3},

{120,2,128,3},

};

四:定义BitMapiso类

类说明:此类提供解析请求包和封装信息包两个方法,例如:

package com.lottery.pos.utils;

import java.util.ArrayList;

import java.util.List;

import com.lottery.pos.model.BitMap;

public class BitMapiso {

/**

* 解析请求包

* @param body

* @param config

* @return List

*/

@SuppressWarnings("unchecked")

public static List unpackRequest(byte[] body, int[][] config) {

List outList = new ArrayList();

// 取得除信息类型以外的包信息。也就是取得位图的初始位置。

byte[] realbody = new byte[body.length - 4];

System.arraycopy(body, 4, realbody, 0, realbody.lengt

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值