亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? iso8583.c

?? 銀行卡相關 Iso8583的實現代碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
/***************************************************************************/
/*          BEIJING NEXTSKY TECHNOLOGY CO. LTD                             */
/*                    2000.06.18                                           */
/***************************************************************************/


#include <stdio.h>
#include "iso8583.h"
#include "convert.h"
#define LS_MAP_BIT 0x80

extern  unsigned char tpdu[];

/***************************************************************************/
/* This table must contain all the pairs which are use by the application  */
/* to transform the data. The embedded defines establish the convert table */
/* indicies which are used in field_table (see tables.h).                  */
/***************************************************************************/
converters convert_table [] = {

#define ASC_ASC	0
			{ asc_to_asc, asc_to_asc },
#define AV3_AV3	1
			{ av3_to_av3, av3_to_av3 },
#define BIT_BIT	2
			{ bit_to_bit, bit_to_bit },
#define BCD_BCD	3
			{ bcd_to_bcd, bcd_to_bcd },
#define BCD_ASC	4
			{ asc_to_bcd, bcd_to_asc },
#define ASC_STR	5
			{ str_to_asc, asc_to_str },
#define BCD_STR	6
			{ str_to_bcd, bcd_to_str },
#define BCD_SNZ	7
			{ str_to_bcd, bcd_to_snz },
#define AV2_STR	8
			{ str_to_av2, av2_to_str },
#define BV2_STR	9
			{ str_to_bv2, bv2_to_str },
#define AV3_STR	10
			{ str_to_av3, av3_to_str },
#define XBC_STR	11
			{ str_to_xbc, xbc_to_str },
#define BV3_STR 12
                        { str_to_bv3, bv3_to_str }
};

/***************************************************************************
 The least significant 4 bits of the following byte will be used to pad
 an odd length packed item in the final nibble. The default is zero.
***************************************************************************/
unsigned char pad_nibble_8583 = 0;

int fn_8583;				/* Field number		*/
unsigned char *src_8583;		/* Source pointer	*/
unsigned char *dst_8583;		/* Destination pointer	*/
unsigned char map_8583[BIT_MAP_SIZE];	/* Map			*/

field_struct  *field_ptr;

int Map_Test(map, field_no)
unsigned char *map;
int field_no;
{
    if (field_no >= 1 && field_no <= 64)
    {
	map += (--field_no >> 3);  /* point at proper byte */
	return(*map & (LS_MAP_BIT >> (field_no & 7))); /* form proper mask */
    }
    else
	return( 0 );
}

/* map_reset

   Reset a particular bit.
*/
void Map_Reset(map, field_no)
unsigned char *map;
int field_no;
{
    if (field_no >= 1 && field_no <= 64)
    {
	map += (--field_no >> 3);
	*map &= ~(LS_MAP_BIT >> (field_no & 7));
    }
}

/***************************************************************************
 Determine the size of the bit map and save it in map_8583.
***************************************************************************/
int capture_map( start )
unsigned char *start;
{
    int      n = 0;
    unsigned char *map_ptr;
    unsigned char map_byte;

    map_ptr = start;
    do 
    {
        map_byte = *map_ptr;		/* Fetch first byte of map     */
        map_ptr += BIT_MAP_SIZE;	/* Skip over this map section  */
        n += BIT_MAP_SIZE;
    } 
    while ( map_byte & LS_MAP_BIT );	/* continue if multiple maps   */

    memcpy( map_8583, start, n );	/* save map in map_8583 global */
    return( n );
}

/***************************************************************************
 This is the main 8583 field processing function.
 Return values:
   -1    Field not defined in field table.
   -2    Stored more in buffer than limit.
   -3    Exceeded size of valid data in buffer.
   -4    Stored more than variable limit on an incomming message.
   -5    No matching variant field definition.
   >0    Assembly: number of bytes put into buffer. Use for write.
   Disassembly: Number of bytes in buffer not processed.
                Should be zero.
***************************************************************************/
int process_iso8583( how, field_tbl, map, buffer, limit )
int how;			/* how=0 => pack, how=1 => unpack	  */
field_struct *field_tbl;	/* pointer to field table		  */
unsigned char *map;		/* pointer to map. Ignored on incomming.  */
unsigned char *buffer;		/* pointer to buffer			  */
int limit;			/* limit on assembly. size on disassembly */
{
    int  map_mask;           /* mask for testing map bits */
    int  n,pp;                  /* number of bytes in map */
    int  rst;                /* result of processing a single field */
    unsigned char *map_ptr;

    /* Initialize pointer to field table */
    field_ptr = field_tbl;

    /* Capture either from parameter or buffer */
    /* Copy map to map_8583 return size */
    n = capture_map((how==0)?map:buffer+7);

    /* Initialize source and destination pointers */
    src_8583 = buffer;
    dst_8583 = buffer;
    fn_8583 = 0;

    process_field(how, buffer);   /* TPDU */
    process_field(how, buffer);   /* Message type */

    /* MODIFICATION TO RECOGNISE TPDU BEGINNING WITH 68 - NMS MESSAGE */
    /* if incoming map and NMS then just return as valid response and */
    /* allow higher level routine to take care!			      */

    if ((how == 1) && ((tpdu[1]&0xff) == 0x68))
    {   puts("BACK!");
	return(-6);  /* bytes remaining */
    } 

    if (how==0) 
    {
         memcpy(buffer+7, map_8583, n);  /* store outgoing map     */
         dst_8583 = buffer+7+n;          /* initialize destination */
    }
    else 
    {
         memcpy(map, map_8583, n);       /* return received map */
         src_8583 = buffer+7+n;          /* initialize source   */
    }
    for (fn_8583=1,map_ptr=map_8583; n; n--,map_ptr++) 
    {
	for (map_mask=LS_MAP_BIT; map_mask; map_mask>>=1,fn_8583++) 
        {
            if (*map_ptr & map_mask) 
            {
  	        rst = process_field(how,buffer);
		if (rst != 0)
                    return( rst );
                if (how == 0) 
                {
                    if ((dst_8583-buffer) > limit)
                        return( -2 );
                }
                else if ((src_8583-buffer) > limit)
                {  
                    puts("PUTSA!");
                    return( -3 );
                }
            }
        }
    }

    if (how == 0)
	return( dst_8583-buffer );	/* bytes put into buffer */
    else return( limit-(int)(src_8583-buffer) );  /* bytes remaining */
}

/***************************************************************************
 Process a single field in the field table.
***************************************************************************/
int process_field( how, buffer )
int  how;		/* how=0 => pack, how=1 => unpack */
unsigned char *buffer;	/* pointer to buffer */
{
    int ci;
    int psz;
    int vsz;
    unsigned char *sv_dst;
    int (*func_ptr) ();

    /* advance to corresponding field in table */
    while ((field_ptr->field_num & FIELD_MASK) != fn_8583) 
    {
         /* Received a field  which isnt defined */
         if (field_ptr->field_num & STOP)
         {   
              puts("BACK!");
              return( -1 );
         }
         memset((char *)(field_ptr->reference),0,field_ptr->var_sz);
                                        
         field_ptr++;
    }
    ci = field_ptr->convert_idx;
    if (ci == VARIANT) 
    {
	psz = do_variant(how,return_variant1(),return_variant2(),&ci,&vsz);
	if (psz < 0)
	    return( psz );
    }
    else 
    if (ci == COMPUTE) 
    {
	func_ptr = (int ((*)()))(field_ptr->reference);
	ci = (*func_ptr)(how, buffer, &psz, &vsz);
    }
    else 
    {
	psz = field_ptr->packet_sz;
	vsz = field_ptr->var_sz;
	if (how == 0)
            src_8583 = (unsigned char *)field_ptr->reference;
        else dst_8583 = (unsigned char *)field_ptr->reference;
    }

    sv_dst = dst_8583;			/* save destination before transfer */
    (*convert_table[ci][how])( psz );	/* call the proper convert function */

    if (how == 1)	/* unpacking */ 
    {
	if ((dst_8583 - sv_dst) > vsz)	/* stored more than limit */
             return( -4 );
    }
    field_ptr++;
    return( 0 );
}

/***************************************************************************
 Process a variant field. Returns packet size field or negative on error.
***************************************************************************/
int do_variant( how, v1, v2, ci, vsz )
int how;		/* how=0 => pack, how=1 => unpack */
unsigned int v1, v2;	/* values for first two columns   */
int *ci;		/* return convert table index     */
int *vsz;		/* return size of variable        */
{
    variant_struct *var_ptr;

    var_ptr = (variant_struct *) field_ptr->reference;

    /* Sequentially search the variant field table */
    while (((var_ptr->variant1 & FIELD_MASK) != v1) &&
          (var_ptr->variant2 != v2)) 
    {
        /* Received a field which is not defined */
        if (var_ptr->variant1 & STOP)
            return -5;
        var_ptr++;
    }

    if (how == 0)
	src_8583 = (unsigned char *) var_ptr->reference;
    else dst_8583 = (unsigned char *) var_ptr->reference;

    *ci = var_ptr->convert_idx;
    *vsz = var_ptr->var_sz;
    return( var_ptr->packet_sz );
}

/***************************************************************************
 Store a length in 1 byte. Stores (length div 10) in high order nibble and
 (length mod 10) in low order nibble. Assumes 0<=n<=99
***************************************************************************/
static int put_len_v2(n)
int n;
{
    *dst_8583++ = (n / 10 << 4) | (n % 10);
    return( n );
}

/***************************************************************************
 Stores a lenth in 2 bytes. First byte is (length div 100), second byte
 stored by the routine above.
***************************************************************************/
static int put_len_v3(n)
int n;
{
    *dst_8583++ = n / 100;
    put_len_v2(n % 100);
    return( n );
}

/***************************************************************************
 Fetch a length from a single byte. See put_len_v2 for details.
***************************************************************************/
static int get_len_v2()
{
    unsigned char ch = *src_8583++;

    return( 10 * (ch >> 4) + (ch & 0x0f) );
}

/***************************************************************************
 Fetch a length from two bytes. See lut_len_v3 for details.
***************************************************************************/
static int get_len_v3()
{
    int len;

    len=100 * ((unsigned char)(*src_8583++));
    len+= get_len_v2() ;
    return(len);
}

void str_to_bv3(c)
int c;
{
   max_asc_to_bv(put_len_v3(strlen(src_8583)), c);
}

void bv3_to_str(c)
int c;
{
   copy_bv_to_str(get_len_v3(), c);
}

/***************************************************************************
 Return the binary result of an ASCII digit. Ex: 32h -> 2
***************************************************************************/
static char get_asc_to_bcd()
{
    return( *src_8583++ - '0' );
}

/***************************************************************************
 Convert low order nibble to ASCII. Assumes this value is 0..9.
***************************************************************************/

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日日摸夜夜添夜夜添精品视频| 欧美亚洲综合久久| 亚洲综合免费观看高清完整版| 欧美第一区第二区| 色综合 综合色| 成人黄页在线观看| 国产精品香蕉一区二区三区| 日韩成人dvd| 免费国产亚洲视频| 麻豆精品在线播放| 秋霞午夜鲁丝一区二区老狼| a在线欧美一区| 99精品视频免费在线观看| 91免费看`日韩一区二区| 成人av在线资源网站| 日韩一区二区在线观看视频 | 亚洲自拍欧美精品| 国产精品69久久久久水密桃 | 欧美日韩中文字幕一区二区| 在线免费观看视频一区| 欧美巨大另类极品videosbest| 欧美日韩精品三区| 欧美成人三级在线| 国产区在线观看成人精品| 国产欧美精品一区二区色综合 | 亚洲激情网站免费观看| 亚洲国产sm捆绑调教视频 | 国产欧美一区二区三区在线看蜜臀 | 色菇凉天天综合网| 欧美丝袜自拍制服另类| 亚洲激情欧美激情| 欧美视频一区二区三区四区| 一区二区三区在线看| 蜜桃av一区二区在线观看| 欧美精选一区二区| 日韩影院在线观看| 日韩免费成人网| 精品亚洲免费视频| caoporen国产精品视频| 亚洲视频小说图片| 一区二区三区不卡视频在线观看 | 精品夜夜嗨av一区二区三区| 日韩欧美电影一区| 国产美女精品在线| 91传媒视频在线播放| 欧美男女性生活在线直播观看| 一本大道av伊人久久综合| 亚洲视频网在线直播| 欧美亚洲一区二区三区四区| 亚洲自拍偷拍九九九| 欧美一区二区三区在线电影| 国产精品久久福利| 久久精品国产精品青草| 欧美最猛性xxxxx直播| 日韩在线a电影| 久久久久综合网| 亚洲风情在线资源站| 日韩手机在线导航| 国产成人鲁色资源国产91色综| 欧美日韩黄色一区二区| 激情文学综合网| 日韩欧美一二三| 国产ts人妖一区二区| xfplay精品久久| 免费看日韩a级影片| 欧美激情一区二区三区四区| 人妖欧美一区二区| 欧美激情综合在线| 欧美日韩久久久| 国产高清精品网站| 水野朝阳av一区二区三区| 久久精品视频一区二区三区| 日韩精品电影在线观看| 国产午夜亚洲精品午夜鲁丝片| 91久久免费观看| 国产中文字幕精品| 亚洲综合另类小说| 欧美国产成人精品| 欧美一级二级三级蜜桃| 成人精品在线视频观看| 国产精品你懂的在线欣赏| 国产精品1区2区3区| 一区二区三区免费网站| 久久尤物电影视频在线观看| 欧美日韩精品一区二区三区四区| 国产成人啪免费观看软件| 婷婷国产v国产偷v亚洲高清| 欧美老肥妇做.爰bbww视频| 国产91富婆露脸刺激对白| 日韩av中文在线观看| 亚洲精品精品亚洲| 国产视频一区二区三区在线观看 | 一区二区三区四区激情 | 538在线一区二区精品国产| 亚洲小说欧美激情另类| 国产精品毛片无遮挡高清| 日韩视频国产视频| 欧美日韩亚洲综合一区| 99精品视频一区| 成人免费视频国产在线观看| 久久99久久久久| 免费一级片91| 日日摸夜夜添夜夜添亚洲女人| 亚洲综合偷拍欧美一区色| 国产欧美日韩精品在线| 欧美成人在线直播| 4438x亚洲最大成人网| 欧美色视频在线观看| 91极品美女在线| 99久久精品国产麻豆演员表| 国产成人精品免费在线| 国产精品一区二区免费不卡 | 欧美不卡视频一区| 欧美一区二区私人影院日本| 88在线观看91蜜桃国自产| 欧美色图一区二区三区| 欧美熟乱第一页| 欧美日免费三级在线| 欧美综合久久久| 欧美另类z0zxhd电影| 91精品婷婷国产综合久久性色| 欧美日韩二区三区| 欧美一级高清片| 久久久影视传媒| 亚洲欧洲日韩综合一区二区| 日韩欧美一区电影| 中文字幕高清一区| 日本一区二区不卡视频| 国产精品久久久久影院色老大| 中文字幕欧美一区| 亚洲一二三区在线观看| 日韩电影在线一区二区三区| 久久99精品一区二区三区三区| 国产资源在线一区| 91一区二区在线| 粉嫩欧美一区二区三区高清影视| 99视频一区二区三区| 欧美色综合网站| 日韩精品一区在线观看| 中文一区二区在线观看 | 国产精品久久久久精k8 | 91高清视频免费看| 日韩色在线观看| 国产三级三级三级精品8ⅰ区| 亚洲人精品午夜| 中文乱码免费一区二区 | 国产精品久久久爽爽爽麻豆色哟哟| 亚洲视频你懂的| 裸体歌舞表演一区二区| 99国产欧美另类久久久精品| 在线亚洲高清视频| 精品区一区二区| 亚洲精品国久久99热| 久久国产精品第一页| a4yy欧美一区二区三区| 欧美一级片免费看| 中文字幕欧美一区| 激情综合色综合久久| 日本久久一区二区三区| www欧美成人18+| 亚洲一二三四在线| 粉嫩av一区二区三区粉嫩 | 2023国产精品| 亚洲一区二区综合| 风流少妇一区二区| 欧美一区二区三区四区视频| 国产精品黄色在线观看| 另类中文字幕网| 欧美视频在线播放| 亚洲色图在线看| 国产成a人亚洲精| 日韩午夜在线观看视频| 亚洲特级片在线| 国产成人av影院| 26uuu久久综合| 日韩精品福利网| 欧美体内she精视频| 国产精品久久午夜| 国产电影一区二区三区| 日韩一级二级三级| 亚洲国产精品麻豆| 色综合色综合色综合色综合色综合 | 激情文学综合网| 日韩欧美一级精品久久| 亚洲小说欧美激情另类| 99国产精品久久久| 国产精品国产三级国产三级人妇| 久久国产乱子精品免费女| 91精品国产综合久久婷婷香蕉 | 九九视频精品免费| 欧美一区二区三区思思人| 亚洲电影第三页| 裸体一区二区三区| 欧美久久一二区| 亚洲成a人v欧美综合天堂| 91高清在线观看| 亚洲永久精品大片| 欧美午夜精品久久久久久超碰| 亚洲女同一区二区| 色噜噜狠狠成人网p站|