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下开发。所以遇到很多问题。通过解决这些问题也学到了不少东西。。值得高兴。。。
浙公网安备 33010602011771号