typedef struct
{
BYTE baOrigMDN[8];
BYTE baDestMDN[8];
BYTE bOrigIsVIP;
BYTE bMsgIsSeed;
BYTE baSeedID[6];
BYTE baQijiSeedID[6];
}csrMTSMsgStrc_T;
如何将baQijiSeedID[6]的内容转成时间字符串(YYYYMMDDHHMMSS)的算法:
BYTE baTimeTmp[6] ={0};
CHAR caSubmitTime[20] = {0}; //内容为YYYYMMDDHHMMSS的时间
memcpy(baTimeTmp, baQijiSeedID, 6);
if (0x80 == (baQijiSeedID [4] & 0xC0))
{
baTimeTmp[0] = 0;
}
if (0x20 == (baQijiSeedID [4] & 0x30))
{
baTimeTmp[1] = 0;
}
if (0x08 == (baQijiSeedID [4] & 0x0C))
{
baTimeTmp[2] = 0;
}
if (0x02 == (baQijiSeedID [4] & 0x03))
{
baTimeTmp[3] = 0;
}
csfClockDecodeProc(baTimeTmp, (BYTE *) caSubmitTime);
// 时间结构
typedef struct
{
BYTE second;
BYTE minute;
BYTE hour;
BYTE day;
BYTE month;
WORD year;
BYTE week;
BYTE Count10ms;
} ClockStruc; /*
* FUNCTION NAME: void TIME_TO_CLOCK(TimePtr, ClockPtr)
* DESCRIPTION: relative clock to real clock
* INPUT: TimePtr: store time pointer
*/
void TIME_TO_CLOCK(DWORD *TimePtr, ClockStruc *ClockPtr)
{
WORD DaysPerYear = 365;
WORD year;
DWORD days, dayss;
DWORD seconds;
BYTE month, day, week, hour, minute, second; days = *TimePtr / 86400; //一天86400s转换为days
seconds = *TimePtr % 86400;
hour = (BYTE)(seconds / 3600);
seconds = seconds % 3600;
minute = (BYTE)(seconds / 60);
second = (BYTE)(seconds % 60);
dayss = days; /* compute year */
year = 1994;
while (days >= DaysPerYear) // DaysPerYear = 365
{
days -= DaysPerYear;
if ((++ year % 4) == 0)
DaysPerYear = 366;
else
DaysPerYear = 365;
} /* compute month */
if ((year % 4) == 0)
DaysPerMonth[1] = 29;
else
DaysPerMonth[1] = 28; month = 1;
while (days >= DaysPerMonth[month - 1])
{
days -= DaysPerMonth[month - 1];
month ++;
} /* compute date and week */
day =(BYTE)(days + 1);
week = (BYTE)((dayss + 6) % 7);
if (week == 0)
week = 7; ClockPtr->year = year;
ClockPtr->month = month;
ClockPtr->day = day;
ClockPtr->hour = hour;
ClockPtr->minute = minute;
ClockPtr->second = second;
ClockPtr->week = week;
}
/*---------------------------------------------------------------------
- 函 数 名: csfClockDecodeProc
- 功能描述: 将DWORD(4个字节)时间值转换为YYYYMMDDHHMMSS字符串
- 输 入: BYTE *pTime ---->DWORD值(秒数)的版权短信发送时间
-
- 输 出: const BYTE *pClock ----> YYYYMMDDHHMMSS字符串
-----------------------------------------------------------------------*/
void csfClockDecodeProc(const BYTE *pbTime, BYTE *pbClock)
{
ClockStruc tClockPtr = {0};
DWORD dwTime = 0 ;
BYTE i;
memcpy(&dwTime, pbTime, 4);
TIME_TO_CLOCK(&dwTime, &tClockPtr);
memset(pbClock, 0, 20);
for (i = 0; i < 4; i++) /* 年 */
{
pbClock[3 - i] = tClockPtr.year % 10 + 0x30;
tClockPtr.year = tClockPtr.year / 10;
}
pbClock[4] = tClockPtr.month / 10 + 0x30; /* 月 */
pbClock[5] = tClockPtr.month % 10 + 0x30;
pbClock[6] = tClockPtr.day / 10 + 0x30; /* 日 */
pbClock[7] = tClockPtr.day % 10 + 0x30;
pbClock[8] = tClockPtr.hour / 10 + 0x30; /* 时 */
pbClock[9] = tClockPtr.hour % 10 + 0x30;
pbClock[10] = tClockPtr.minute / 10 + 0x30; /* 分 */
pbClock[11] = tClockPtr.minute % 10 + 0x30;
pbClock[12] = tClockPtr.second / 10 + 0x30; /* 秒 */
pbClock[13] = tClockPtr.second % 10 + 0x30;
} 步骤如下:1:将BCD码的高低4位互换
2:将互换后的BCD码转为字符串
A)对于种子短信ID的转码算法
/*---------------------------------------------------------------------
- 函 数 名: csBcdToStr
- 功能描述: 将BCD码转换成字符串
- 输 入: pbBcd ----> BCD码流
- bInLen ----> BCD码流的字节数
- bBufLen ----> 接收字符串用缓冲区长度
- 输 出: pcStrBuf ----> 接收字符串用缓冲区
-----------------------------------------------------------------------*/
BOOL csBcdToStr( BYTE* pbBcd,
BYTE bInLen,
PCHAR pcStrBuf,
BYTE bBufLen)
{
BYTE bTmp;
BYTE cTmp;
BYTE i;
BYTE bMaxBcdLen; if( !pbBcd || !pcStrBuf || !bBufLen ) /* 入参检查 */
{
return FALSE;
} bMaxBcdLen = min(bInLen*2, bBufLen-1); for( i=0; i<bMaxBcdLen; i++ )
{
bTmp = pbBcd[i/2]; if( i&1 ) /* 奇数 */
{
bTmp = bTmp >> 4;
} bTmp &= 0x0f; if((bTmp >= 0) && (bTmp <=9))
cTmp = bTmp +'0';
else if(bTmp == 0x0d)
cTmp = '*';
else if(bTmp == 0x0e)
cTmp = '#';
else if (bTmp == (BYTE)0x0f)
break;
else
return FALSE; pcStrBuf[i] = cTmp; } pcStrBuf[i] = 0; /* 字符串结束 */ return TRUE;}B)对于用户MDN的转码算法
VOID csrBCDToString(const BYTE *lpBcd,CHAR *lpString,BYTE size)
{
BYTE i,j=0;
BYTE ch;
for(i=0;i<size;i++)
{
ch = (lpBcd[i]&0xF0)>>4;
if(ch<=9 /*&& ch>=0*/)
{
lpString[j] = (CHAR)(ch+0x30); //from '0'
j++;
}
else if(ch>=10 && ch<=15)
{
lpString[j] = (CHAR)(ch+0x41-10); //from 'A'
j++;
}
else // if(ch==0x0f)
{
if( j< size*2 )
{
while ( j<size*2 ) lpString[j++] = 'f';
lpString[j] = 0x00;
return ;
}
lpString[j++]=0x00;
break;
}
ch = lpBcd[i]&0x0F;
if(ch<=9 /*&& ch>=0*/)
lpString[j++]= (CHAR)(ch+0x30);
else if(ch>=10 && ch<=15)
lpString[j++] = (CHAR)(ch+0x41-10); //from A
else //if(ch==0x0f)
{
if( j< size*2 )
{
while(j<size*2) lpString[j++] = 'f';
lpString[j] = 0x00;
return ;
}
lpString[j++]=0x00;
break;
}
} // for
lpString[j++]=0x00;
return ;
}
{
BYTE baOrigMDN[8];
BYTE baDestMDN[8];
BYTE bOrigIsVIP;
BYTE bMsgIsSeed;
BYTE baSeedID[6];
BYTE baQijiSeedID[6];
}csrMTSMsgStrc_T;
如何将baQijiSeedID[6]的内容转成时间字符串(YYYYMMDDHHMMSS)的算法:
BYTE baTimeTmp[6] ={0};
CHAR caSubmitTime[20] = {0}; //内容为YYYYMMDDHHMMSS的时间
memcpy(baTimeTmp, baQijiSeedID, 6);
if (0x80 == (baQijiSeedID [4] & 0xC0))
{
baTimeTmp[0] = 0;
}
if (0x20 == (baQijiSeedID [4] & 0x30))
{
baTimeTmp[1] = 0;
}
if (0x08 == (baQijiSeedID [4] & 0x0C))
{
baTimeTmp[2] = 0;
}
if (0x02 == (baQijiSeedID [4] & 0x03))
{
baTimeTmp[3] = 0;
}
csfClockDecodeProc(baTimeTmp, (BYTE *) caSubmitTime);
// 时间结构
typedef struct
{
BYTE second;
BYTE minute;
BYTE hour;
BYTE day;
BYTE month;
WORD year;
BYTE week;
BYTE Count10ms;
} ClockStruc; /*
* FUNCTION NAME: void TIME_TO_CLOCK(TimePtr, ClockPtr)
* DESCRIPTION: relative clock to real clock
* INPUT: TimePtr: store time pointer
*/
void TIME_TO_CLOCK(DWORD *TimePtr, ClockStruc *ClockPtr)
{
WORD DaysPerYear = 365;
WORD year;
DWORD days, dayss;
DWORD seconds;
BYTE month, day, week, hour, minute, second; days = *TimePtr / 86400; //一天86400s转换为days
seconds = *TimePtr % 86400;
hour = (BYTE)(seconds / 3600);
seconds = seconds % 3600;
minute = (BYTE)(seconds / 60);
second = (BYTE)(seconds % 60);
dayss = days; /* compute year */
year = 1994;
while (days >= DaysPerYear) // DaysPerYear = 365
{
days -= DaysPerYear;
if ((++ year % 4) == 0)
DaysPerYear = 366;
else
DaysPerYear = 365;
} /* compute month */
if ((year % 4) == 0)
DaysPerMonth[1] = 29;
else
DaysPerMonth[1] = 28; month = 1;
while (days >= DaysPerMonth[month - 1])
{
days -= DaysPerMonth[month - 1];
month ++;
} /* compute date and week */
day =(BYTE)(days + 1);
week = (BYTE)((dayss + 6) % 7);
if (week == 0)
week = 7; ClockPtr->year = year;
ClockPtr->month = month;
ClockPtr->day = day;
ClockPtr->hour = hour;
ClockPtr->minute = minute;
ClockPtr->second = second;
ClockPtr->week = week;
}
/*---------------------------------------------------------------------
- 函 数 名: csfClockDecodeProc
- 功能描述: 将DWORD(4个字节)时间值转换为YYYYMMDDHHMMSS字符串
- 输 入: BYTE *pTime ---->DWORD值(秒数)的版权短信发送时间
-
- 输 出: const BYTE *pClock ----> YYYYMMDDHHMMSS字符串
-----------------------------------------------------------------------*/
void csfClockDecodeProc(const BYTE *pbTime, BYTE *pbClock)
{
ClockStruc tClockPtr = {0};
DWORD dwTime = 0 ;
BYTE i;
memcpy(&dwTime, pbTime, 4);
TIME_TO_CLOCK(&dwTime, &tClockPtr);
memset(pbClock, 0, 20);
for (i = 0; i < 4; i++) /* 年 */
{
pbClock[3 - i] = tClockPtr.year % 10 + 0x30;
tClockPtr.year = tClockPtr.year / 10;
}
pbClock[4] = tClockPtr.month / 10 + 0x30; /* 月 */
pbClock[5] = tClockPtr.month % 10 + 0x30;
pbClock[6] = tClockPtr.day / 10 + 0x30; /* 日 */
pbClock[7] = tClockPtr.day % 10 + 0x30;
pbClock[8] = tClockPtr.hour / 10 + 0x30; /* 时 */
pbClock[9] = tClockPtr.hour % 10 + 0x30;
pbClock[10] = tClockPtr.minute / 10 + 0x30; /* 分 */
pbClock[11] = tClockPtr.minute % 10 + 0x30;
pbClock[12] = tClockPtr.second / 10 + 0x30; /* 秒 */
pbClock[13] = tClockPtr.second % 10 + 0x30;
} 步骤如下:1:将BCD码的高低4位互换
2:将互换后的BCD码转为字符串
A)对于种子短信ID的转码算法
/*---------------------------------------------------------------------
- 函 数 名: csBcdToStr
- 功能描述: 将BCD码转换成字符串
- 输 入: pbBcd ----> BCD码流
- bInLen ----> BCD码流的字节数
- bBufLen ----> 接收字符串用缓冲区长度
- 输 出: pcStrBuf ----> 接收字符串用缓冲区
-----------------------------------------------------------------------*/
BOOL csBcdToStr( BYTE* pbBcd,
BYTE bInLen,
PCHAR pcStrBuf,
BYTE bBufLen)
{
BYTE bTmp;
BYTE cTmp;
BYTE i;
BYTE bMaxBcdLen; if( !pbBcd || !pcStrBuf || !bBufLen ) /* 入参检查 */
{
return FALSE;
} bMaxBcdLen = min(bInLen*2, bBufLen-1); for( i=0; i<bMaxBcdLen; i++ )
{
bTmp = pbBcd[i/2]; if( i&1 ) /* 奇数 */
{
bTmp = bTmp >> 4;
} bTmp &= 0x0f; if((bTmp >= 0) && (bTmp <=9))
cTmp = bTmp +'0';
else if(bTmp == 0x0d)
cTmp = '*';
else if(bTmp == 0x0e)
cTmp = '#';
else if (bTmp == (BYTE)0x0f)
break;
else
return FALSE; pcStrBuf[i] = cTmp; } pcStrBuf[i] = 0; /* 字符串结束 */ return TRUE;}B)对于用户MDN的转码算法
VOID csrBCDToString(const BYTE *lpBcd,CHAR *lpString,BYTE size)
{
BYTE i,j=0;
BYTE ch;
for(i=0;i<size;i++)
{
ch = (lpBcd[i]&0xF0)>>4;
if(ch<=9 /*&& ch>=0*/)
{
lpString[j] = (CHAR)(ch+0x30); //from '0'
j++;
}
else if(ch>=10 && ch<=15)
{
lpString[j] = (CHAR)(ch+0x41-10); //from 'A'
j++;
}
else // if(ch==0x0f)
{
if( j< size*2 )
{
while ( j<size*2 ) lpString[j++] = 'f';
lpString[j] = 0x00;
return ;
}
lpString[j++]=0x00;
break;
}
ch = lpBcd[i]&0x0F;
if(ch<=9 /*&& ch>=0*/)
lpString[j++]= (CHAR)(ch+0x30);
else if(ch>=10 && ch<=15)
lpString[j++] = (CHAR)(ch+0x41-10); //from A
else //if(ch==0x0f)
{
if( j< size*2 )
{
while(j<size*2) lpString[j++] = 'f';
lpString[j] = 0x00;
return ;
}
lpString[j++]=0x00;
break;
}
} // for
lpString[j++]=0x00;
return ;
}
不同语言的实现能一样么。c++写100行,也许java一个api就搞定。
现在转这个太有难度了,刚毕业那会,c和java都会时,还可以帮你搞定,现在c可望完了哟
SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMddHHmmss");
System.out.println(sdf.format(lTimestamp));
就算api用了200行代码那又有什么 不就是为了方便么 哪有你这样抬杠的
api相对来说就已经是某个功能用java实现的极限了 你再用java写也最多写道和api水平一样的
API只有Java有啊?C++里面没有API啊?Java一个API能搞定,C++就必须得自己写100行代码啊?啥道理啊?看来你们都是高人,写代码不超过100行。因为只需要一个api就搞定
有人要写一个编辑器,你跟人说:"你写100w行,别人一个Word就搞定"
人家不是说C++转java了么。