【问题标题】:Transfer hex value to a decimal value将十六进制值转换为十进制值
【发布时间】:2020-12-17 02:20:43
【问题描述】:

我正在尝试使用值 .Hours.Minutes.Seconds 操作结构 atime1 的值,出于某种原因,我需要的值是这些变量的十六进制值,所有树是int

然后我以不改变十六进制值的方式“连接”三个变量。 十六进制值:

aTime.Hours=0x13
aTime.Minutes=0x30
aTime.Seconds=0x15
ttt=0x133015

然后我需要将具有12574930x133015 的dec 值的变量ttt 转换为133015 的十进制值。

这就是我不知道如何进行转换的地方。

到目前为止,这是我的代码。

HAL_RTC_GetTime(&hrtc, &aTime1, RTC_FORMAT_BCD);
HAL_RTC_GetDate(&hrtc, &aDate1, RTC_FORMAT_BCD);
ttt = aTime1.Hours;
ttt = ((ttt % 100000) * 256 + aTime1.Minutes);
ttt = ((ttt % 100000) * 256 + aTime1.Seconds);

【问题讨论】:

  • 计算机不能使用十六进制的十进制值;它们都以二进制形式工作。十六进制和十进制是以更紧凑的方式向人类显示数字的两种方式。你应该知道十六进制是如何工作的:0x1330150x13 * 0x1000 + 0x30 * 0x100 + 0x15 * 0x1。同样的逻辑,十进制的13301513 * 10000 + 30 * 100 + 15。我看不出0x133015133015 之间的关系。 0x13 是 19 小时,0x30 是 48 分钟,0x15 是 21 秒。

标签: c stm32


【解决方案1】:

来自实时时钟 (RTC) 的信息以二进制编码的十进制 (BCD) 格式提供给您。这意味着每个字节由两个十进制数字组成。最高有效十进制数字(MSDD)在高四位,最低有效十进制数字(LSDD)在低四位。

所以第一步是提取单个数字,我会将这些数字存储在一个数组中。要提取 MSDD,请右移 4 位。要提取 LSDD,请使用 0xf 进行掩码。

提取数字后,可以使用for 循环来生成最终结果。

代码如下:

#include <stdio.h>

struct stTime
{
    int Hours;
    int Minutes;
    int Seconds;
};

int main(void)
{
    struct stTime aTime = { 0x13, 0x30, 0x15 };

    int digits[6];
    digits[0] = aTime.Hours >> 4;
    digits[1] = aTime.Hours & 0xf;
    digits[2] = aTime.Minutes >> 4;
    digits[3] = aTime.Minutes & 0xf;
    digits[4] = aTime.Seconds >> 4;
    digits[5] = aTime.Seconds & 0xf;

    int result = 0;
    for (int i = 0; i < 6; i++)
        result = result * 10 + digits[i];

    printf("%d\n", result);
}

输出:133015

【讨论】:

    猜你喜欢
    • 2014-02-05
    • 1970-01-01
    • 2011-08-04
    • 2018-01-22
    • 1970-01-01
    • 1970-01-01
    • 2012-02-03
    • 2013-06-16
    相关资源
    最近更新 更多