以下这段代码是C解析8583报文,我直接从我们系统粘贴出来的,供大家参考。打日志log部分,请自行更改,TAG标签也可以根据你的55域做相应删减。
typedef struct
{
char sFldTag[5];
char sFldLen[3];
int nFldLen;
char sFldVal[65];
} T_F55_Sub_Fld;
/*--------------------------------------------------------------------------
FUNCTION NAME: TxnChkIcData.
DESCRIPTION: pCardNo 卡号
PARAMETER: pCardSeqId 卡序列号,域23
data IC卡数据域,域55
len 域55头长度
RETURN: result :0 -success other-failure
NOTE: xq 20150617
*------------------------------------------------------------------------ */
int TxnChkIcData1(const char * pCardNo, const char * pCardSeqId, char *data, int *len)
{
char sHexData[255 * 2] = {0};
char sCardSeqId[4];
char sCardNo[20];
char bank_code[9];
int nHexDataLen = (*len)*2;
int nRet = 0;
char sSrc[512];
int msg_len = 0;
memset(sCardNo, 0x00, sizeof(sCardNo));
memset(sCardSeqId, 0x00, sizeof(sCardSeqId));
memcpy(sCardNo, pCardNo, 19);
memcpy(sCardSeqId, pCardSeqId, 3);
memcpy(sHexData, data, nHexDataLen);
vLogErr(0, "nHexDataLen=[%d],sHexData=[%s]",nHexDataLen,sHexData);
/* 解析IC卡数据 */
T_F55_Sub_Fld tF55SubFld4[16];
T_F55_Sub_Fld tF55SubFld2[15];
memset(&tF55SubFld4, 0x00, sizeof(T_F55_Sub_Fld) * 15);
memcpy(tF55SubFld4[0].sFldTag, "9F26", 4); /* 应用密文 */
memcpy(tF55SubFld4[1].sFldTag, "9F27", 4); /* 密文信息数据 */
memcpy(tF55SubFld4[2].sFldTag, "9F10", 4); /* 发卡行应用数据 */
memcpy(tF55SubFld4[3].sFldTag, "9F37", 4); /* 不可预知数 */
memcpy(tF55SubFld4[4].sFldTag, "9F36", 4); /* 应用交易计数器 */
memcpy(tF55SubFld4[5].sFldTag, "9F02", 4); /* 授权金额 */
memcpy(tF55SubFld4[6].sFldTag, "5F2A", 4); /* 交易货币代码 */
memcpy(tF55SubFld4[7].sFldTag, "9F1A", 4); /* 终端国家代码 */
memcpy(tF55SubFld4[8].sFldTag, "9F03", 4); /* 其他金额 */
memcpy(tF55SubFld4[9].sFldTag, "9F33", 4); /* 终端性能 */
memcpy(tF55SubFld4[10].sFldTag, "9F34", 4);
memcpy(tF55SubFld4[11].sFldTag, "9F35", 4);
memcpy(tF55SubFld4[12].sFldTag, "9F1E", 4);
memcpy(tF55SubFld4[13].sFldTag, "9F63", 4); /*银行编码*/
memcpy(tF55SubFld4[15].sFldTag, "9F09", 4);
memcpy(tF55SubFld4[14].sFldTag, "9F41", 4);
memset(&tF55SubFld2, 0x00, sizeof(T_F55_Sub_Fld) * 15);
memcpy(tF55SubFld2[0].sFldTag, "95", 2); /* 终端验证结果 */
memcpy(tF55SubFld2[1].sFldTag, "9A", 2); /* 交易日期 */
memcpy(tF55SubFld2[2].sFldTag, "9C", 2); /* 交易类型 */
memcpy(tF55SubFld2[3].sFldTag, "82", 2); /* 应用交互特征 */
memcpy(tF55SubFld2[4].sFldTag, "91", 4); /* 发卡行验证数据 */
memcpy(tF55SubFld2[5].sFldTag, "84", 4);
memcpy(tF55SubFld2[6].sFldTag, "9A", 4);
memcpy(tF55SubFld2[7].sFldTag, "9C", 4);
int nHexDataPos = 0;
int nFldLen = 0;
while (nHexDataPos < nHexDataLen)
{
char sTag[5] = {0};
memcpy(sTag, &sHexData[nHexDataPos], 4);
int i = 0;
for (i = 0; i < 16; i++)
{
if (memcmp(&sHexData[nHexDataPos], tF55SubFld4[i].sFldTag, 4) == 0)
{
nHexDataPos += 4;
memcpy(tF55SubFld4[i].sFldLen, &sHexData[nHexDataPos], 2);
if(tF55SubFld4[i].sFldLen[0] == '1')
tF55SubFld4[i].nFldLen = fun(tF55SubFld4[i].sFldLen) * 2;
else
tF55SubFld4[i].nFldLen = atol(tF55SubFld4[i].sFldLen) * 2;
nHexDataPos += 2;
memcpy(tF55SubFld4[i].sFldVal, &sHexData[nHexDataPos], tF55SubFld4[i].nFldLen);
nHexDataPos += tF55SubFld4[i].nFldLen;
break;
}
}
if (i == 16)
{
memcpy(sTag, &sHexData[nHexDataPos], 2);
for (i = 0; i < 8; i++)
{
if (memcmp(&sHexData[nHexDataPos], tF55SubFld2[i].sFldTag, 2) == 0)
{
nHexDataPos += 2;
memcpy(tF55SubFld2[i].sFldLen, &sHexData[nHexDataPos], 2);
tF55SubFld2[i].nFldLen = atol(tF55SubFld2[i].sFldLen) * 2;
nHexDataPos += 2;
memcpy(tF55SubFld2[i].sFldVal, &sHexData[nHexDataPos], tF55SubFld2[i].nFldLen);
nHexDataPos += tF55SubFld2[i].nFldLen;
break;
}
}
if (i == 8)
{
break;
}
}
}
#if 0
vLogErr(0, "tF55SubFld4[0].nFldLen[%d]",tF55SubFld4[0].nFldLen);
vLogErr(0, "tF55SubFld4[1].nFldLen[%d]",tF55SubFld4[1].nFldLen);
vLogErr(0, "tF55SubFld4[2].nFldLen[%d]",tF55SubFld4[2].nFldLen);
vLogErr(0, "tF55SubFld4[3].nFldLen[%d]",tF55SubFld4[3].nFldLen);
vLogErr(0, "tF55SubFld4[4].nFldLen[%d]",tF55SubFld4[4].nFldLen);
vLogErr(0, "tF55SubFld4[5].nFldLen[%d]",tF55SubFld4[5].nFldLen);
vLogErr(0, "tF55SubFld4[6].nFldLen[%d]",tF55SubFld4[6].nFldLen);
vLogErr(0, "tF55SubFld4[7].nFldLen[%d]",tF55SubFld4[7].nFldLen);
vLogErr(0, "tF55SubFld4[8].nFldLen[%d]",tF55SubFld4[8].nFldLen);
vLogErr(0, "tF55SubFld4[9].nFldLen[%d]",tF55SubFld4[9].nFldLen);
vLogErr(0, "tF55SubFld4[13].nFldLen[%d]",tF55SubFld4[13].nFldLen);
vLogErr(0, "tF55SubFld4[0].sFldVal[%s]",tF55SubFld4[0].sFldVal);
vLogErr(0, "tF55SubFld4[1].sFldVal[%s]",tF55SubFld4[1].sFldVal);
vLogErr(0, "tF55SubFld4[2].sFldVal[%s]",tF55SubFld4[2].sFldVal);
vLogErr(0, "tF55SubFld4[3].sFldVal[%s]",tF55SubFld4[3].sFldVal);
vLogErr(0, "tF55SubFld4[4].sFldVal[%s]",tF55SubFld4[4].sFldVal);
vLogErr(0, "tF55SubFld4[5].sFldVal[%s]",tF55SubFld4[5].sFldVal);
vLogErr(0, "tF55SubFld4[6].sFldVal[%s]",tF55SubFld4[6].sFldVal);
vLogErr(0, "tF55SubFld4[7].sFldVal[%s]",tF55SubFld4[7].sFldVal);
vLogErr(0, "tF55SubFld4[8].sFldVal[%s]",tF55SubFld4[8].sFldVal);
vLogErr(0, "tF55SubFld4[9].sFldVal[%s]",tF55SubFld4[9].sFldVal);
vLogErr(0, "tF55SubFld4[13].sFldVal[%s]",tF55SubFld4[13].sFldVal);
vLogErr(0, "tF55SubFld2[0].nFldLen[%d]",tF55SubFld2[0].nFldLen);
vLogErr(0, "tF55SubFld2[1].nFldLen[%d]",tF55SubFld2[1].nFldLen);
vLogErr(0, "tF55SubFld2[2].nFldLen[%d]",tF55SubFld2[2].nFldLen);
vLogErr(0, "tF55SubFld2[3].nFldLen[%d]",tF55SubFld2[3].nFldLen);
vLogErr(0, "tF55SubFld2[0].sFldVal[%s]",tF55SubFld2[0].sFldVal);
vLogErr(0, "tF55SubFld2[1].sFldVal[%s]",tF55SubFld2[1].sFldVal);
vLogErr(0, "tF55SubFld2[2].sFldVal[%s]",tF55SubFld2[2].sFldVal);
vLogErr(0, "tF55SubFld2[3].sFldVal[%s]",tF55SubFld2[3].sFldVal);
#endif
}