C语言实现Cp56time2a时间格式与北京时间的转换 - (已编译,亲试可用~)

  • CP56time2a的描述

    • CP56time2a是101/104规约中定义的时间格式

    • CP56time2a是七个八位位组二进制时间
      Alt

    • 关于“星期的某天

      星期的某天 = <0> 未采用
      星期的某天 = <1…7>采用
      星期一:= <1>
      星期二:= <2>
      星期三:= <3>
      星期四:= <4>
      星期五:= <5>
      星期六:= <6>
      星期日:= <7>

  • 代码干货~

    • 结构体定义

      
      #pragma pack(push, 1)
      typedef volatile union
      {
      	uint64_t Time;			// 低7字节是七个八位位组二进制时间	
      	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;
      }st_cp56time2a;
      
      #pragma pack(pop)
      
      st_cp56time2a  Cp56time2a;			// 定义结构体‘ Cp56time2a ’
      
      
    • CP56time2a 转 北京时间

      • CP56time2a(xx xx xx xx xx xx xx) 转 北京时间(年 月 日 星期几 时 分 秒)

        
         	Cp56time2a.Time = 0x1509010A1FA1E3;  
        
        	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);
        	
        
      • 运行结果

        运行结果:2021年9月1日 10点31分41秒
        Alt

    • 北京时间 转 CP56time2a

      • 北京时间(年 月 日 星期几 时 分 秒) 转 CP56time2a(xx xx xx xx xx xx xx)

        
        Cp56time2a.Compts.year 	= 21;
        Cp56time2a.Compts.month	= 9;
        Cp56time2a.Compts.mday	= 1;
        Cp56time2a.Compts.hour	= 10;
        Cp56time2a.Compts.min	= 31;
        Cp56time2a.Compts.msec	= 41443;
        
        printf("\n\tCp56time2a:  %llX \n\r", Cp56time2a.Time);
        	
        
      • 运行结果

        运行结果:0x1509010A1FA1E3
        请添加图片描述

    若此文对你有帮助~敢不敢,点个赞再走(o゜▽゜)o☆

  • 16
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
CP56Time2a是一种时间格式,它通常用于电力系统中的通信协议。以下是一个使用C语言实现CP56Time2a格式的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <time.h> #define CP56_TIME_LENGTH 7 typedef struct { unsigned short ms; // 毫秒 unsigned char min; // 分钟 unsigned char hour; // 小时 unsigned char day; // 日 unsigned char month; // 月 unsigned short year; // 年 } CP56Time2a; void packCP56Time2a(CP56Time2a* time, unsigned char* buffer) { buffer[0] = (time->ms >> 8) & 0xFF; buffer[1] = time->ms & 0xFF; buffer[2] = time->min; buffer[3] = time->hour; buffer[4] = time->day; buffer[5] = time->month; buffer[6] = (time->year >> 8) & 0xFF; buffer[7] = time->year & 0xFF; } void unpackCP56Time2a(unsigned char* buffer, CP56Time2a* time) { time->ms = (buffer[0] << 8) | buffer[1]; time->min = buffer[2]; time->hour = buffer[3]; time->day = buffer[4]; time->month = buffer[5]; time->year = (buffer[6] << 8) | buffer[7]; } int main() { CP56Time2a time; unsigned char buffer[CP56_TIME_LENGTH]; // 获取当前时间 time_t now = time(NULL); struct tm* tm_time = localtime(&now); // 将当前时间转换CP56Time2a格式 time.ms = 0; time.min = tm_time->tm_min; time.hour = tm_time->tm_hour; time.day = tm_time->tm_mday; time.month = tm_time->tm_mon + 1; time.year = tm_time->tm_year + 1900; // 打包CP56Time2a格式数据 packCP56Time2a(&time, buffer); // 输出打包结果 printf("Packed CP56Time2a: "); for (int i = 0; i < CP56_TIME_LENGTH; i++) { printf("%02X ", buffer[i]); } printf("\n"); // 解包CP56Time2a格式数据 CP56Time2a unpacked_time; unpackCP56Time2a(buffer, &unpacked_time); // 输出解包结果 printf("Unpacked CP56Time2a: %04d-%02d-%02d %02d:%02d:%02d.%03d\n", unpacked_time.year, unpacked_time.month, unpacked_time.day, unpacked_time.hour, unpacked_time.min, 0, unpacked_time.ms); return 0; } ``` 在这个示例代码中,我们首先定义了一个`CP56Time2a`结构体,它包含了CP56Time2a格式中的所有字段。然后,我们定义了`packCP56Time2a`和`unpackCP56Time2a`函数来将`CP56Time2a`结构体转换为字节数组,以及将字节数组转换为`CP56Time2a`结构体。最后,我们在`main`函数中获取当前时间,将其转换为`CP56Time2a`格式,并打印出打包和解包的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力的小肥丸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值