一、UTC/RTC时间
1、将UNIX时间戳转为东八区时间字符串
#include <stdio.h>
#include <time.h>
void unix_timestamp_to_string(time_t timestamp, char* time_string) {
struct tm * timeinfo;
timestamp = 8*3600+timestamp;
timeinfo = localtime(×tamp);
//timeinfo->tm_hour += 8; // 增加8小时来获取东八区时间
strftime(time_string, 20, "%Y-%m-%d %H:%M:%S", timeinfo);
}
int main() {
time_t timestamp = 1609459200; // 2021年1月1日08:00:00,UTC时间
char time_string[80];
unix_timestamp_to_string(timestamp, time_string);
printf("Converted time: %s\n", time_string);
return 0;
}
2、将时间字符串(无分隔符)转为UNIX时间戳
#include <stdio.h>
#include <time.h>
time_t string_to_unix_timestamp(const char *time_str) {
struct tm tm_time = {0}; // 初始化 tm 结构体
// 解析时间字符串
if (sscanf(time_str, "%4d%2d%2d%2d%2d",
&tm_time.tm_year, &tm_time.tm_mon, &tm_time.tm_mday,
&tm_time.tm_hour, &tm_time.tm_min) != 5) {
printf("Invalid data\n");
return 0;
}
// 由于 tm_year 表示的是自 1900 年起的年数,需要减去 1900
tm_time.tm_year -= 1900;
// 减去 1 来使月份从 0 开始,即 0 表示 1 月
tm_time.tm_mon -= 1;
// 将 tm 结构体转换为时间戳并返回
return mktime(&tm_time);
}
int main() {
const char *time_str = "202203121030";
time_t timestamp = string_to_unix_timestamp(time_str);
if (timestamp != 0) {
printf("Unix timestamp: %ld\n", timestamp);
}
return 0;
}
3、将将时间字符串(含分隔符-
,:
)转为UNIX时间戳
#include <stdio.h>
#include <time.h>
time_t string_to_unix_timestamp(char *time_str) {
struct tm tm;
time_t timestamp;
strptime(time_str, "%Y-%m-%d %H:%M:%S", &tm); // 解析时间字符串
timestamp = mktime(&tm); // 转换为时间戳
return timestamp;
}
int main() {
char time_str[] = "2022-03-12 10:30:00";
time_t timestamp = string_to_unix_timestamp(time_str);
if (timestamp != -1) {
printf("Unix timestamp: %ld\n", timestamp);
struct tm *timeinfo = localtime(×tamp);
printf("Converted time: %s\n", asctime(timeinfo));
} else {
printf("Invalid data\n");
}
return 0;
}
4、获取系统中的东八区时间
#include <stdio.h>
#include <time.h>
void get_local_time() {
time_t rawtime;
struct tm * timeinfo;
char buffer[80];
time(&rawtime);
timeinfo = localtime(&rawtime);
strftime(buffer, 80, "%Y-%m-%d %H:%M:%S", timeinfo);
printf("Local time: %s\n", buffer);
}
int main() {
get_local_time();
return 0;
}
二、IEEE 754 标准下的单精度浮点数
在某些协议里可能会以浮点数的32位字节形式发送,如YD/T电总协议是以ASCII码发送浮点数的四个字节,由低到高的顺序。
函数测试链接:三贝计算网
1、浮点数转HEX字符串(小端存储,即低字节在前)
#include <stdio.h>
char* floatToHexString(float f) {
unsigned char *bytes = (unsigned char *)&f;
static char result[9]; // 为结果字符串分配内存,4个字节每个两个十六进制字符,加一个字符串终止符
// 格式化为十六进制字符串
sprintf(result, "%02X%02X%02X%02X", bytes[0], bytes[1], bytes[2], bytes[3]);
return result;
}
int main() {
float f = 3.14f;
char* hexString = floatToHexString(f);
printf("Hex representation of %f is %s\n", f, hexString);
return 0;
}
2、十六进制字符串转换为单精度浮点数(小端格式)
#include <stdint.h>
#include <stdio.h> // 包含 sscanf 函数的头文件
#include <string.h>
float hexStringToFloatLE(const char *hex) {
uint32_t num = 0;
int i = 0;
unsigned int byteValue = 0;
float result;
// 解析十六进制字符串到 num(假设字符串是小端格式的)
for (i = 0; hex[i] != '\0' && i < 8; i += 2) {
// 将每两个十六进制字符转换为一个字节,并以小端方式填充 num
byteValue = 0;
sscanf(&hex[i], "%02x", &byteValue);
num |= byteValue << (i * 4);
}
// 将整数转换为浮点数
memcpy(&result, &num, sizeof(float));
return result;
}
int main() {
const char *hexString = "0000C841"; // 对应浮点数 25.0f 的小端表示
float f = hexStringToFloatLE(hexString);
printf("Float representation of %s is %f\n", hexString, f);
return 0;
}
3、十六进制字符串转换为单精度浮点数(大端格式)
#include <stdint.h>
#include <stdio.h> // 包含 sscanf 函数的头文件
#include <string.h>
float hexStringToFloatBE(const char *hex) {
uint32_t num = 0;
int i=0;
unsigned int byteValue = 0;
float result;
// 解析十六进制字符串到 num(假设字符串是大端格式的)
for (i = 0; hex[i] != '\0' && i < 8; i += 2) {
// 将每两个十六进制字符转换为一个字节,并以大端方式填充 num
byteValue = 0;
sscanf(&hex[i], "%02x", &byteValue);
num = (num << 8) | byteValue;
}
// 将 num 的内存表示解释为浮点数
memcpy(&result, &num, sizeof(float));
return result;
}
int main() {
const char* hexString = "41C80000"; // 对应浮点数 25.0f的大端表示
float f = hexStringToFloatBE(hexString);
printf("Float representation of %s is %f\n", hexString, f);
return 0;
}