⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iso8583.cpp

📁 ISO 8583 implementation.
💻 CPP
📖 第 1 页 / 共 5 页
字号:
// Network Management Request
 BOOL ISO8583MSG::IsNetworkMgmtRequest(void)
{
	// Message-Type-Identifier [12..15=4]    	
	return((memcmp((PBYTE)&chMsg[12], CISO_MSGTYPE_NETMGMT_RQST, 4) == 0));
}

// Network Management Response
 BOOL ISO8583MSG::IsNetworkMgmtResponse(void)
{
	// Message-Type-Identifier [12..15=4]    	
	return((memcmp((PBYTE)&chMsg[12], CISO_MSGTYPE_NETMGMT_RESP, 4) == 0));
}

// Es valido el Campo#?
 BOOL ISO8583MSG::IsValidField(WORD wField)
	{
	// Precondicion: Mensaje existente
	if(!cbMsgLen) 
		return (FALSE);

	// Precondicion: Campos validos
	if(!(wField >= 1 && wField <= CISOFIELDS)) 
		return (FALSE);

	// El Bitmap es una representacion hexadecimal {'0'..'9','A'..'F'},
	// tambien conocida como Bytemap cuando es en forma ASCII, como esta.
	// Cada digito indica la presencia o ausencia de campos, 
	// 4 por cada digito, y hasta un maximo de 64 campos, o sea
	// 16 posiciones. Si son dos Bitmaps, ocuparan 32 digitos.
	WORD wBitMapPos = 0;     // Posicion en BitMap (4 campos x c/u) 		
	BYTE bPosBitMap = 0x00;  // BitMap Binario de Posicion (4 bits)
	BYTE bBit       = 0x00;  // Bit en BitMap de Posicion {0,1,2,3}
	BYTE *pchBitMap = NULL;  // BitMap respectivo (Primario/Secundario)

	// Tratamiento como indice, 0..127, no como ISO 1..128: resto 1.
	wField--;

	// Posicion en BitMap? (4 campos cada posicion)
	wBitMapPos = (wField / 4);
	// Bit dentro del BitMap de Posicion (4 bits cada digito, 0..9,A..F)
	bBit = (BYTE)(wField % 4);
	
	// En que BitMap es, si c/u tiene 16 posiciones?
	if(wBitMapPos >= 0 && wBitMapPos <= 15) 
		{
		pchBitMap = &chMsg[16]; // Primary Bitmap
		}
	else
		{
		wBitMapPos -= BITMAP_STR_LEN;
		pchBitMap = &chMsg[32]; // Secondary Bitmap
		}

	// Chequeo de Posicion en BitMap
	if(!(wBitMapPos >= 0 && wBitMapPos <= 15))
		return (FALSE);

	// Bitmap ASCII (Bytemap) a Bitmap Binario (SWITCH por claridad en vez de restar 48='0')
	switch(pchBitMap[wBitMapPos])
		{
		// ASCII             // Decimal
		case '0': bPosBitMap = 0;  break; 
		case '1': bPosBitMap = 1;  break; 
		case '2': bPosBitMap = 2;  break; 
		case '3': bPosBitMap = 3;  break; 
		case '4': bPosBitMap = 4;  break; 
		case '5': bPosBitMap = 5;  break; 
		case '6': bPosBitMap = 6;  break; 
		case '7': bPosBitMap = 7;  break; 
		case '8': bPosBitMap = 8;  break; 
		case '9': bPosBitMap = 9;  break; 
		case 'A': bPosBitMap = 10; break; 
		case 'B': bPosBitMap = 11; break; 
		case 'C': bPosBitMap = 12; break; 
		case 'D': bPosBitMap = 13; break; 
		case 'E': bPosBitMap = 14; break; 
		case 'F': bPosBitMap = 15; break; 
		default:  return (FALSE);
		}
	
	// Esta presente el Bit en el BitMap de la Posicion?	
	// Se lo verifica con mascaras de bits predefinidas,
	// y con el operador AND
	switch(bBit)
		{
		case 0:  return ( 0x08 & bPosBitMap ) ? TRUE : FALSE; 
		case 1:  return ( 0x04 & bPosBitMap ) ? TRUE : FALSE; 
		case 2:  return ( 0x02 & bPosBitMap ) ? TRUE : FALSE; 
		case 3:  return ( 0x01 & bPosBitMap ) ? TRUE : FALSE; 
		default: return (FALSE);
		}	
	
	}

// Hacer valido/presente el Campo#
 BOOL ISO8583MSG::MakeValidField(BYTE chXMsg[], WORD wField)
	{
	// Precondicion: Mensaje existente
	if(!cbMsgLen) 
		return (FALSE);

	// Campos validos?
	if(!(wField >= 1 && wField <= CISOFIELDS)) 
		return (FALSE);

	// Ver comentarios de IsValidField()
	WORD wBitMapPos = 0;     // Posicion en BitMap (4 campos x c/u) 		
	BYTE bPosBitMap = 0x00;  // BitMap Binario de Posicion (4 bits)
	BYTE bBit       = 0x00;  // Bit en BitMap de Posicion {0,1,2,3}
	BYTE *pchBitMap = NULL;  // BitMap respectivo (Primario/Secundario)

	// Tratamiento como indice, 0..127, no como ISO 1..128
	wField--;

	// Posicion en BitMap? (4 campos cada posicion)
	wBitMapPos = (wField / 4);
	// Bit dentro del BitMap de Posicion (4 bits cada digito, 0..9,A..F)
	bBit = (BYTE)(wField % 4);
	
	// En que BitMap es, si c/u tiene 16 posiciones?
	if(wBitMapPos >= 0 && wBitMapPos <= 15) 
		{
		pchBitMap = &chXMsg[16]; // Primary Bitmap
		}
	else
		{
		wBitMapPos -= BITMAP_STR_LEN;
		pchBitMap = &chXMsg[32]; // Secondary Bitmap
		}

	// Chequeo de Posicion en BitMap
	if(!(wBitMapPos >= 0 && wBitMapPos <= 15))
		return (FALSE);

	// Bitmap ASCII (Bytemap) a Bitmap Binario (SWITCH por claridad en vez de restar 48='0')
	switch(pchBitMap[wBitMapPos])
		{
		// ASCII            // Decimal
		case '0': bPosBitMap = 0;  break; 
		case '1': bPosBitMap = 1;  break; 
		case '2': bPosBitMap = 2;  break; 
		case '3': bPosBitMap = 3;  break; 
		case '4': bPosBitMap = 4;  break; 
		case '5': bPosBitMap = 5;  break; 
		case '6': bPosBitMap = 6;  break; 
		case '7': bPosBitMap = 7;  break; 
		case '8': bPosBitMap = 8;  break; 
		case '9': bPosBitMap = 9;  break; 
		case 'A': bPosBitMap = 10; break; 
		case 'B': bPosBitMap = 11; break; 
		case 'C': bPosBitMap = 12; break; 
		case 'D': bPosBitMap = 13; break; 
		case 'E': bPosBitMap = 14; break; 
		case 'F': bPosBitMap = 15; break; 
		default:  return (FALSE);
		}
	
	// Hacer presente el Bit en el BitMap de la Posicion
	// Se lo hace con mascaras de bits predefinidas,
	// y con el operador INCLUSIVE-OR
	switch(bBit)
		{
		case 0:  bPosBitMap |= 0x08; break; 
		case 1:  bPosBitMap |= 0x04; break;  
		case 2:  bPosBitMap |= 0x02; break;  
		case 3:  bPosBitMap |= 0x01; break;  
		default: return (FALSE);
		}

	// Bitmap Binario a ASCII (SWITCH por claridad en vez de sumar 48='0')
	switch(bPosBitMap) 
		{
		// Decimal                     // ASCII
		case 0 : pchBitMap[wBitMapPos] = '0'; break; 
		case 1 : pchBitMap[wBitMapPos] = '1'; break; 
		case 2 : pchBitMap[wBitMapPos] = '2'; break; 
		case 3 : pchBitMap[wBitMapPos] = '3'; break; 
		case 4 : pchBitMap[wBitMapPos] = '4'; break; 
		case 5 : pchBitMap[wBitMapPos] = '5'; break; 
		case 6 : pchBitMap[wBitMapPos] = '6'; break; 
		case 7 : pchBitMap[wBitMapPos] = '7'; break; 
		case 8 : pchBitMap[wBitMapPos] = '8'; break; 
		case 9 : pchBitMap[wBitMapPos] = '9'; break; 
		case 10: pchBitMap[wBitMapPos] = 'A'; break; 
		case 11: pchBitMap[wBitMapPos] = 'B'; break; 
		case 12: pchBitMap[wBitMapPos] = 'C'; break; 
		case 13: pchBitMap[wBitMapPos] = 'D'; break; 
		case 14: pchBitMap[wBitMapPos] = 'E'; break; 
		case 15: pchBitMap[wBitMapPos] = 'F'; break; 
		default:  return (FALSE);
		}

	// Ok
	return (TRUE);
	
	}

// Hacer invalido/no-presente el Campo#
 BOOL ISO8583MSG::MakeInvalidField(BYTE chXMsg[], WORD wField)
	{
	// Precondicion: Mensaje existente
	if(!cbMsgLen) 
		return (FALSE);

	// Campos validos?
	if(!(wField >= 1 && wField <= CISOFIELDS)) 
		return (FALSE);

	// Ver comentarios de IsValidField()
	WORD wBitMapPos = 0;     // Posicion en BitMap (4 campos x c/u) 		
	BYTE bPosBitMap = 0x00;  // BitMap Binario de Posicion (4 bits)
	BYTE bBit       = 0x00;  // Bit en BitMap de Posicion {0,1,2,3}
	BYTE *pchBitMap = NULL;  // BitMap respectivo (Primario/Secundario)

	// Tratamiento como indice, 0..127, no como ISO 1..128
	wField--;

	// Posicion en BitMap? (4 campos cada posicion)
	wBitMapPos = (wField / 4);
	// Bit dentro del BitMap de Posicion (4 bits cada digito, 0..9,A..F)
	bBit = (BYTE)(wField % 4);
	
	// En que BitMap es, si c/u tiene 16 posiciones?
	if(wBitMapPos >= 0 && wBitMapPos <= 15) 
		{
		pchBitMap = &chXMsg[16]; // Primary Bitmap
		}
	else
		{
		wBitMapPos -= BITMAP_STR_LEN;
		pchBitMap = &chXMsg[32]; // Secondary Bitmap
		}

	// Chequeo de Posicion en BitMap
	if(!(wBitMapPos >= 0 && wBitMapPos <= 15))
		return (FALSE);

	// Bitmap ASCII (Bytemap) a Bitmap Binario (SWITCH por claridad en vez de restar 48='0')
	switch(pchBitMap[wBitMapPos])
		{
		// ASCII            // Decimal
		case '0': bPosBitMap = 0;  break; 
		case '1': bPosBitMap = 1;  break; 
		case '2': bPosBitMap = 2;  break; 
		case '3': bPosBitMap = 3;  break; 
		case '4': bPosBitMap = 4;  break; 
		case '5': bPosBitMap = 5;  break; 
		case '6': bPosBitMap = 6;  break; 
		case '7': bPosBitMap = 7;  break; 
		case '8': bPosBitMap = 8;  break; 
		case '9': bPosBitMap = 9;  break; 
		case 'A': bPosBitMap = 10; break; 
		case 'B': bPosBitMap = 11; break; 
		case 'C': bPosBitMap = 12; break; 
		case 'D': bPosBitMap = 13; break; 
		case 'E': bPosBitMap = 14; break; 
		case 'F': bPosBitMap = 15; break; 
		default:  return (FALSE);
		}
	
	// Hacer no-presente el Bit en el BitMap de la Posicion
	// Se lo hace con mascaras de bits predefinidas,
	// y con el operador EXCLUSIVE-OR
	switch(bBit)
		{
		case 0:  bPosBitMap ^= 0x08; break; 
		case 1:  bPosBitMap ^= 0x04; break;  
		case 2:  bPosBitMap ^= 0x02; break;  
		case 3:  bPosBitMap ^= 0x01; break;  
		default: return (FALSE);
		}

	// Bitmap Binario a ASCII (SWITCH por claridad en vez de sumar 48='0')
	switch(bPosBitMap)
		{
		// Decimal                     // ASCII
		case 0 : pchBitMap[wBitMapPos] = '0'; break; 
		case 1 : pchBitMap[wBitMapPos] = '1'; break; 
		case 2 : pchBitMap[wBitMapPos] = '2'; break; 
		case 3 : pchBitMap[wBitMapPos] = '3'; break; 
		case 4 : pchBitMap[wBitMapPos] = '4'; break; 
		case 5 : pchBitMap[wBitMapPos] = '5'; break; 
		case 6 : pchBitMap[wBitMapPos] = '6'; break; 
		case 7 : pchBitMap[wBitMapPos] = '7'; break; 
		case 8 : pchBitMap[wBitMapPos] = '8'; break; 
		case 9 : pchBitMap[wBitMapPos] = '9'; break; 
		case 10: pchBitMap[wBitMapPos] = 'A'; break; 
		case 11: pchBitMap[wBitMapPos] = 'B'; break; 
		case 12: pchBitMap[wBitMapPos] = 'C'; break; 
		case 13: pchBitMap[wBitMapPos] = 'D'; break; 
		case 14: pchBitMap[wBitMapPos] = 'E'; break; 
		case 15: pchBitMap[wBitMapPos] = 'F'; break; 
		default:  return (FALSE);
		}

	// Ok
	return (TRUE);
	
	}

// Es valido el mensaje?
 BOOL ISO8583MSG::IsValidMessage(void)
	{
	// Precondicion: Mensaje existente
	if(!cbMsgLen) 
		return (FALSE);

	/////////////////////////////////////////
	// Precondicion: Verificacion habilitada?
	if(!bCheckMessage) 
		return (TRUE);
	/////////////////////////////////////////

	// Compara cada parte del Mensaje
	// El Header esta Ok?
	if( !IsValidHeader() )
		return (FALSE);
	
	// El Tipo de Transaccion esta Ok?
	if( !IsValidTransactionType() )
		return (FALSE);

	// Los Datos de Usuario estan Ok?
	if( !IsValidUserData() )
		return (FALSE);

	// Ok
	return (TRUE);
	}

// Es valido el tipo de transaccion?
 BOOL ISO8583MSG::IsValidTransactionType(void)
	{
	// Precondicion: Mensaje existente
	if(!cbMsgLen) 
		return (FALSE);

	/////////////////////////////////////////
	// Precondicion: Verificacion habilitada?
	if(!bCheckMessage) 
		return (TRUE);
	/////////////////////////////////////////

	// El Tipo de Mensaje y BitMaps esta alguno Ok?
	if( IsValid200()  || IsValid205()  || IsValid210() ||
	    IsValid215()  || IsValid220()  || IsValid221() ||
		IsValid230()  || IsValid420()  || IsValid421() ||
		IsValid430()  || IsValid800()  || IsValid810()		 
	  ) return (TRUE);

	// Tipo Trx invalido
    return (FALSE);
	}

// Es valido el Header?
 BOOL ISO8583MSG::IsValidHeader(void)
	{
	// Precondicion: Mensaje existente
	if(!cbMsgLen) 
		return (FALSE);

	// Precondicion : Mensaje OBLIGATORIAMENTE con ISO-Header-Indicator. [0..2=3]
	if(memcmp((PBYTE)&chMsg[0], "ISO", 3) != 0)
		return (FALSE);

	/////////////////////////////////////////
	// Precondicion: Verificacion habilitada?
	if(!bCheckMessage) 
		return (TRUE);
	/////////////////////////////////////////

	// ISO-Header-Data [3..11=9]
	// Product-Id [3..4=2]
	if((memcmp((PBYTE)&chMsg[3], "00", 2) != 0) && // Base/Propietary
	   (memcmp((PBYTE)&chMsg[3], "01", 2) != 0) && // B24 ATM
	   (memcmp((PBYTE)&chMsg[3], "02", 2) != 0) && // B24 POS
	   (memcmp((PBYTE)&chMsg[3], "03", 2) != 0) && // B24 Teller
	   (memcmp((PBYTE)&chMsg[3], "08", 2) != 0) && // From Host Maintenance
	   (memcmp((PBYTE)&chMsg[3], "11", 2) != 0) && // B24 EMS
	   (memcmp((PBYTE)&chMsg[3], "12", 2) != 0))   // B24 EFTPOS
		return (FALSE);

	// Release-Number [5..6=2] (B24 Release 4.0="40", Release 5.1="51",...)
	if(!isdigit(chMsg[5]) || !isdigit(chMsg[6]))
	   return (FALSE);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -