CP56Time2A时间转换

发布时间 2023-12-13 10:08:53作者: xioahuhu

* CP56Time2A时间格式

  • 该时标格式使用7个字节来表示时间信息,上图的表中体现为——从最左侧8所在的行开始,到下面56所在的行,共7行。每一行表示一个字节,每行从右向左依次是该字节的第一位(最低位)、第二位....第八位(最高位)。
  • 该时标格式使用56个二进制数(56bit)存储时间信息,这56个数分别有对应的序号(1-56)。Milliseconds占用了两个字节;尖括号中的0——59999即时间信息中秒的范围是0-59999ms(0.000~59.999s)。
#pragma pack(push, 1)
// cp56time2a时间格式
typedef union
{
	// 低7字节是七个八位位组二进制时间	
	uint64_t Cp56Time;
	
	struct
	{
		uint16_t msec;
		uint8_t min	: 6;
		uint8_t res1    : 1;
		uint8_t iv 	: 1;
		uint8_t hour 	: 5;
		uint8_t res2 	: 2;
		uint8_t su 	: 1;
		uint8_t mday 	: 5;
		uint8_t wday 	: 3;
		uint8_t month   : 4;
		uint8_t res3 	: 4;
		uint8_t year 	: 7;
		uint8_t res4 	: 1;
	}Compts;
}Cp56Time2a;

// 本地时间结构体 
typedef struct
{
	uint8_t year;
	uint8_t month;
	uint8_t mday;
	uint8_t hour;
	uint8_t min;
	uint16_t msec;
}Time;
#pragma pack(pop)


Time time = {0};  // 定义一个保存时间的结构体
Cp56Time2a cp56time2a =  {0};  // 定义一个cp56time2a的结构体

// cp56time2a 转本地时间
static uint64_t Cp56time2aToLocalTime(uint64_t cp56time2atime)
{
	printf("\n\t Year  :  %d \n\r", cp56time2a.Compts.year);
	printf("\n\t month :  %d \n\r", cp56time2a.Compts.month);
	printf("\n\t mday  :  %d \n\r", cp56time2a.Compts.mday);
	printf("\n\t wday  :  %d \n\r", cp56time2a.Compts.wday);	
	printf("\n\t hour  :  %d \n\r", cp56time2a.Compts.hour);
	printf("\n\t min   :  %d \n\r", cp56time2a.Compts.min);
	printf("\n\t msec  :  %d \n\r", cp56time2a.Compts.msec);
	return 0;
}	

// 本地时间转cp56time2a格式 
static void LocalTimeToCp56Time2a(Cp56Time2a *time)
{
    cp56time2a.Compts.year 	= time->time[1];
	cp56time2a.Compts.month	= time->time[2];
	cp56time2a.Compts.mday	= time->time[3];
	cp56time2a.Compts.hour	= time->time[4];
	cp56time2a.Compts.min	= time->time[5];
	cp56time2a.Compts.msec	= time->time[6];
}

uint64_t LocalTimeToCp56Time2a(const Time *time)
{	
        cp56time2a.Compts.year 	= time->year;
	cp56time2a.Compts.month	= time->month;
	cp56time2a.Compts.mday	= time->month;
	cp56time2a.Compts.hour	= time->hour;
	cp56time2a.Compts.min	= time->min;
	cp56time2a.Compts.msec	= time->msec;
	
    return cp56time2a.Cp56Time;
}

int main(void)
{
        time.year = 23;
	time.month = 12;
	time.mday = 12;
	time.hour =18;
	time.min = 30;
	time.msec = 40;
	
	printf("\n\t cp56time2a 0X:%llX \n\r", LocalTimeToCp56Time2a(&time));
    return 0;
}