嵌入式通用代码合集

一、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(&timestamp);
    //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(&timestamp);
        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;
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小谦·

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

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

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

打赏作者

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

抵扣说明:

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

余额充值