📄 iso8583.cpp
字号:
// 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 + -