4个字节的16进制数字转换成标准时间,C++

比如4个字节的16进制数4E056450,低字节在前,代表从1970年开始到现在的秒数,怎么将这4个字节转换成标准时间相反过来,知道目前的标准时间,怎么转化成4个字节的1... 比如4个字节的16进制数4E 05 64 50,低字节在前,代表从1970年开始到现在的秒数,怎么将这4个字节转换成标准时间

相反过来,知道目前的标准时间,怎么转化成4个字节的16进制数
请附上C++代码,谢谢
展开
 我来答
ljw_0001
2012-09-29
知道答主
回答量:17
采纳率:0%
帮助的人:5万
展开全部

#include <stdio.h>

#include <math.h>

#define YEAR     (60*60*24*356)

#define MONTH  (60*60*24*30)

#define DAY      (60*60*24)

#define HOUR   (60*60)

#define MINUTE 60


void HexToTime(unsigned char *p, int n)

{

    unsigned int temp=0;

    unsigned int y=0,mon,d,h,min,sec;

    /*unsigned char mon=0;

    unsigned char d=0;

    unsigned char h=0;

    unsigned char min=0;

    unsigned char sec=0;*/

    int i;

    for(i=0; i<8; i++)

    {

        switch( *(p+i) )

        {

        case 'A':

        case 'a': *(p+i)=10; break;


        case 'B':

        case 'b': *(p+i)=11; break;


        case 'C':

        case 'c': *(p+i)=12; break;


        case 'D':

        case 'd': *(p+i)=13; break;


        case 'E':

        case 'e': *(p+i)=14; break;


        case 'F':

        case 'f': *(p+i)=15; break;

        default:  *(p+i)=*(p+i)-'0';

        }

    }

    temp=*(p+7)+ 

         *(p+6)*16+

         *(p+5)*16*16+

          *(p+4)*16*16*16+

         *(p+3)*16*16*16*16+

         *(p+2)*16*16*16*16*16+

         *(p+1)*16*16*16*16*16*16+

         (*p)*16*16*16*16*16*16*16;

     y=temp/YEAR;

     mon=temp%YEAR/MONTH;

     d=temp%YEAR%MONTH/DAY;

     h=temp%YEAR%MONTH%DAY/HOUR;

     min=temp%YEAR%MONTH%DAY%HOUR/MINUTE;

     sec=temp%YEAR%MONTH%DAY%HOUR%MINUTE;

     

     printf("\nThe current is :");

     printf("\n%-6d%-6d%-6d%-6d%-6d%-6d",sec,min,h,d,mon,1970+y);

     


}


int main(void)

{

     unsigned char arra[8];

    //unsigned char arra[8]={"4e056450"};

   // unsigned char arra[8]={'4','e','0','5','6','4','5','0'};

    printf("please input 8 char\n");

    scanf("%s",arra);
 

    HexToTime(arra,8);

    return 0;

 }

在VS2008测试通过。

上海巴鲁图工程机械科技有限公司_
2022-05-15 广告
增量编码器一般输出信号是两路正交脉冲信号和一路参考信号,之所以叫增量是因为它的位置信号是通过对脉冲计数累加得到,依靠计数设备的内部记忆来记住位置,并且同每圈输出的参考信号来清除累计误差. 缺点就是断电后,需要重新寻找初始位置. 例如打印机扫... 点击进入详情页
本回答由上海巴鲁图工程机械科技有限公司_提供
vipcxj
2012-10-13 · TA获得超过503个赞
知道小有建树答主
回答量:213
采纳率:100%
帮助的人:168万
展开全部
LS写那么多代码确实很令人佩服。但是犯了个巨大的错误~~

一年是365天(闰年366天)啊,不是356天。
所以不管LS写了多少都不可能是对的。

其实已经有现成的函数可以满足LZ的条件了
当包含<time.h>这个头文件后,可以使用以下几个函数。
__time32_t _time32(__time32_t *timer);
其中__time32_t就是LZ说的从1970年开始到现在的秒数,并且是32位,4字节。参数是个指针,可以认为是输出参数。即此函数会将timer改成你所需要的秒数。返回值相同的功能。

errno_t _localtime32_s(struct tm* _tm, const time32_t *time);
这个函数能够将LZ说所得那个秒数,即time转换为一个tm类型结构体_tm。这是time.h中定义的一个描述时间的结构体,包含年月日时分秒等。完全符合LZ你的要求。这里要注意返回值,只有当返回值是0时,才代表转换成功。非0返回值都代表错误代码。

__time32_t _mktime32(struct tm *timeptr);
这个函数和上面的那个功能类似,只不过正好反过来。

以下是例子:
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
int main( )
{
char buff[128]={0};
tm _tm;
__time32_t timer;
_time32(&timer); //以秒数的形式得到当前系统时间。
if (_localtime32_s(&_tm, &timer)) //将秒数转换为tm类型结构体。
{
exit(0);
}
if (asctime_s(buff , &_tm)) //将_tm转换为字符串,以便于打印到屏幕上。
{
exit(0);
}
cout << buff << endl;
buff[0]='\0';
timer = _mktime32(&_tm); //将tm类型结构体再转回秒数。
if (_ctime32_s(buff, &timer)) //将秒数转换为字符串,以便于打印到屏幕上。
{
exit(0);
}
cout << buff << endl;
system("pause");
}

输出结果:
Fri Oct 12 23:16:32 2012
Fri Oct 12 23:16:32 2012
请按任意键继续. . .
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式