Macros

给我一支烟!请所有烦恼都能过往如云烟!

导航

UINT64类型的数据接收

头次在开发用socket取得流水号的过程中。。对端定义的流水号类型为UINT64类型。
我方在接收这种类型的数据时总是不正确。经过vckbase上网友yy_yangy的热心帮助终于搞定了,
具体如下:

UINT64 read64( unsigned char* src )
{
    UINT64 v = 0;
#ifdef BIG_ENDIAN
    unsigned char* dest = (unsigned char*)(&v) + sizeof(UINT64) - 1;
    *dest-- = *src++;
    *dest-- = *src++;
    *dest-- = *src++;
    *dest-- = *src++;
    *dest-- = *src++;
    *dest-- = *src++;
    *dest-- = *src++;
    *dest = *src;
#else
    unsigned char* dest = (unsigned char*)(&v);
    *dest++ = *src++;
    *dest++ = *src++;
    *dest++ = *src++;
    *dest++ = *src++;
    *dest++ = *src++;
    *dest++ = *src++;
    *dest++ = *src++;
    *dest = *src;
#endif
    return v;
}
/************************************************************************
Function : BSN扣费业务
Input    : cFullPhone     扣费号码
           cAccountNo   设备号对应的合同号
           iCharge    实收金额
           iServiceCharge 应收金额
           LateFee    本期节余
Output   : 0              Success
           Other          Failed
Author   : wgk
Date     : 2007-06-09 10:50
Modify   :
Modi_date:
*************************************************************************/
long BSNFullResult(char *cAccountNo,char *iCharge,char *iServiceCharge,char *LateFee,char *Balance,char *cCycleId,char *cPaySerialNbr,int iCount)
{
  int isSuccess;
  char ErrMess[100];
  char cPaySerNbr[40] = "";
  /*初始化应答结构体*/
  int num = 0;
  unsigned long lSerialNbr = 0;
  FILE *file = NULL;
    
  isSuccess = (int)sBsnResultBody[iCount].Success;
  if(isSuccess == 1)
  {
    (void)strcpy(cAccountNo,sBsnResultBody[iCount].Item.ChargeResult.AccountNo);
   sprintf(iCharge,"%ld",htonl(sBsnResultBody[iCount].Item.ChargeResult.OldServiceCharge));
   sprintf(iServiceCharge,"%ld",htonl(sBsnResultBody[iCount].Item.ChargeResult.ServiceCharge));
   sprintf(LateFee,"%ld",htonl(sBsnResultBody[iCount].Item.ChargeResult.BillItem[0].LateFee));
   sprintf(Balance,"%ld",htonl(sBsnResultBody[iCount].Item.ChargeResult.Balance));
   sprintf(cCycleId,"%ld",htonl(sBsnResultBody[iCount].Item.ChargeResult.CycleId));
   
   (void)memset(cPaySerNbr,0,sizeof(cPaySerNbr));
   (void)memcpy(cPaySerNbr,&sBsnResultBody[iCount].Item.ChargeResult.PaySerialNbr, \
      sizeof(sBsnResultBody[iCount].Item.ChargeResult.PaySerialNbr));
   
   
   sBsnResultBody[iCount].Item.ChargeResult.PaySerialNbr = read64( (unsigned char*) &sBsnResultBody[iCount].Item.ChargeResult.PaySerialNbr );
   
   printf("PaySerialNbr3:%lu",sBsnResultBody[iCount].Item.ChargeResult.PaySerialNbr);
   sprintf(cPaySerialNbr,"%lu",sBsnResultBody[iCount].Item.ChargeResult.PaySerialNbr);
   
   return SUCCESS;
  }
  (void)strcpy(ErrMess,sBsnResultBody[iCount].Item.FailReason);

  printf("销账解析数据失败!原因为:%s",ErrMess);

  return FAILURE;
}
终于把接收到为数据正确的转换过来了。。
但是在前台显示的时候。却又遇到输出接收到的数据不正确的问题。
   printf("PaySerialNbr3:%ld",sBsnResultBody[iCount].Item.ChargeResult.PaySerialNbr);
   printf("PaySerialNbr3:%I64d",sBsnResultBody[iCount].Item.ChargeResult.PaySerialNbr);
都不正确.
结果却用:  
 printf("PaySerialNbr3:%lu",sBsnResultBody[iCount].Item.ChargeResult.PaySerialNbr);
搞定了。。:)
自己第一次用socket在linux下开发。所以遇到很多问题。通过解决这些问题也学到了不少东西。。值得高兴。。。

posted on 2007-07-31 19:34  Macros  阅读(1071)  评论(0)    收藏  举报