C解析8583报文55域

来源:互联网 发布:风景线打印软件最新版 编辑:程序博客网 时间:2024/06/11 09:01

以下这段代码是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
}

0 0