银行卡信息交换标准及其实现-2

1、表中消息类型标识符 MESSAGE-TYPE-IDENTIFIER 是一个 4 位数字的字段,指明消息的交易类型,其定义如下:

0100 授权类请求消息(授权、撤消授权。余额查询等)

0110 授权类应答消息(授权、撤消授权。余额查询等)

[@more@]

2、位图表BITMAP就是对消息报文格式的描述,每一位用“0”或“1”来表示与该位对应的数据元不存在或存在,用来对其后的数据元进行索引。位图表的第一位设为'1',表示使用扩展位图(128个域),否则表示只使用基本位图(64个域)。对于授权/撤消授权类交易只使用基本位图,因此位图表第一位设为0。授权/撤消授权类交易的BITMAP常数如表二所示:

消 息 名 称

数 据 元 位(BIT) 号

BITMAP 常 数

POS

2,3,4,7,22,26,35,36,37,41,

42,43,49,52,60,61,64

7200 0440 38E0 9019

POS

2,3,4,7,11,15,22,37,38,39,41,42,43,,49, 54,60,63,64

7222 0400 0EE0 8413

POS

2,3,4,7,22,26,35,36,37,

41,42,43,49,52,60,61,64

7200 0440 38E0 9019

POS

2,3,4,7,11,15,22,37,38,39,41,42,43,49,60,62,63,64

7222 0400 0EE0 8013

表二 授权/撤消授权类交易的BITMAP常数表

为尽量减少传送消息的长度,提高通信效率。位号为26353652 61的数据元仅在请求消息中出现,在 应答 现。 而位号为1115383963 的数据元仅在应答消息中出现,在请求消息中将不出现。

3、在银行卡交换中心和卡终端之间的消息交换中,ISO8583标准定义的数据元有以下基本类型:

A 字母,左靠,右部多余部分填空格

B 二进制位

DD

hh

LL 可变长域的长度值(二位数)

LLL 可变长域的长度值(三位数)

MM

mm

N 数值,右靠,首位有效数字前充零。若表示金额,则最右二位为角分

S 特殊符号

ss

X 借贷符号,在数值之前,D表示借记,C表示贷记

YY

ISO8583的标准文献中有对于关这些数据元更详细的描述,并且在应用中可对基本数据类型进行任意组合构造出新的数据类型,如:

AN 字母和/或数字,左靠,右部多余部分填空格

ANS字母、数字和/或特殊符号,左靠,右部多余部分填空格

AS 字母和/或特殊符号,左靠,右部多余部分填空格

三、ISO8583标准的程序实现

1、数据元类型

根据ISO8583标准规定,我们用类ISO_8583用来描述一个数据元的属性:

class ISO_8583{ // ISO8583数据元定义

private:

char data_name; // 数据元名

int len; // 最大长度或固定长度

unsigned char type; // 数据类型 bit 0: C/D 数据域

// bit 1:数值数据域

// bit 2: track2/track3 数据域

// bit 3: BIN数据域

unsigned char flag; // 长度类型 0:固定长度

// 1:可变长度 (00--99),

// 2:可变长度 (00--999);

friend class ISO_8583_message;

public:

ISO_8583()

}

然后,用类ISO_8583来构造一个对象数组ISO8583[128]作为数据元素描述表作为打包和解包的依据。ISO8583[128]中的每一个数组元素描述了一个数据元的属性,例如:

ISO8583[1]={PRIMARY-ACCOUNT-NUMBER”,1921}

ISO8583[2]={PROCESSING-CODE”,620}

上面的定义说明,在ISO8583数据元素描述表中,第二个数据元为用户主帐号、最大长度19位、数值类型、可变长度,第三个数据元为交易类型码、长度为6、数值类型、固定长度。

2、数据元定义

对数据元类型进行描述之后,需要对数据元进行定义为了实现通用的打包/解包接口, 在对数据元进行定义时需要一种通用的数据元类型, 这种类型应涵盖ISO8583标准中128个数据元所有可能出现的各种类型:

class data_element_flag{

int bitf;

int len;

int dbuf_addr;

}

class ISO_8583_data{

private:

int off; //数据指针

data_element_flag f[128];

char message_id[8]; //消息类型标识符

char dbuf[512];

public:

ISO_8583_data();

ISO_8583_data(const ISO_8583_data &);

~ISO_8583_data();

asc_to_bcd(int);

bcd_to_asc(int);

}

为提高线路上数据的传输效率,规定在上送的消息包中,数据类型为“N”的域一律采用BCD码压缩,不足位数右补零处理。

3、消息处理

对消息的主要处理是:提供ISO8583的打包和解释报文的函数功能,不同的银行可以定义不同的交易报文格式。类ISO_8583_MESSAGE实现了消息处理,简化了ISO8583消息操作的复杂性,为应用提供了一个通用的打包和解包的接口。解包和打包处理在程序实现中类似于两个互逆的操作过程。在解包时进行如下处理:首先进行预处理,即将收到的消息中的报文类型标识符和位图表去掉,其余部分作为一个原封不动的字符串保留在dstr中,并不进行继续解包。而实际上当某个应用需要对数据元进行具体访问时,真正的解包操作才发生,并且处理函数只为该应用解释它要访问的那个位域。

class ISO_8583_message{

private:

union{

ISO_8583_data *iso; //存放要打包的数据

unsigned char *dstr; //存放解包的数据

}

static int index;

public:

ISO_8583_message();

~ ISO_8583_message();

int strtoiso(int); //初始化接收报文

int isotostr(unsigned char); //初始化发送报文

void pack8583();

void unpack8583();

const ISO_8583_data &operator[](int ); //读取ISO8583数据元

ISO_8583_data &operator()(int ); // 设置ISO8583位域

void clearbit();

}

为了应用方便,在ISO_8583_message的成员函数(具体实现程序略)中,重载了 []和()运算符,这两个运算符用以对对数据元进行访问,其参数为ISO8583报文中的位域号。当需要设置数据元时,可使用()加下标的方法作为左值来设置一个数据元;当需要读取数据元时,可使用[]加下标的方法作为右值来取值。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/61327/viewspace-822843/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/61327/viewspace-822843/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值