c:将十六进制转换为相同的十进制数

时间:2015-10-13 08:37:41

标签: c

我有

UINT8 year = 0x15;

我想从UINT8 decYear获取year中的十进制值15。我该怎么做 ?三江源

背景:我准备好日,月,年。我今天得到的值分别为0x15,0x10,0x13。我想将它们转换为十进制值

6 个答案:

答案 0 :(得分:3)

您正在使用的表示称为Binary Coded Decimal,它是一种旧的编码方式。

获得正确的"您需要知道二进制值如何工作的十进制值,以及如何在C中使用按位运算符。

假设您有BCD编码值0x15,这是二进制00010101。如您所见,1存储在高nibble中,5存储在低int year = 0x15; int high_nibble = year & 0xf0; // Gets the high nibble, i.e. `0x10` int low_nibble = year & 0x0f; // Gets the low nibble, i.e. `0x05` 中。将它们自己取出是一个简单的按位和操作:

0x10

现在您有两个变量,一个包含0x05,另一个包含0x05。十六进制值5与十进制值10相同,因此无需进行任何操作。另一个值需要一些工作才能使其成为小数00010000。为此,我们只需将其向下移动四位(00000001将成为high_nibble >> 4 )做

10

和"转换"它是十进制的,你将值乘以1 * 10 == 105),最后添加int decYear = ((year & 0xf0) >> 4) * 10 + (year & 0x0f);

将所有内容组合成一个表达式:

ldd:FATAL: Could not load library libgtest.so.0

答案 1 :(得分:1)

在这种特定情况下,您可以使用此

UINT8 year = 0x15;
UINT8 yearD = year%16+ (year/16)*10;

使用BCD编码

有更好的解决方案
 UINT8 yearD = ((year>>4)&0x0f)*10+ (year&0x0f);

说明:

0x15的二进制表示形式为‭00010101‬。我们有nibble高{1 0001)和低半字节5(0101)。所以最终结果是higher nibble value *10 + value of lower nibble。要获得高半字节值,我们会shift直到bitwise AND 0x0f,4右移高半字节值到低半字节,bitwise and 0x0f清除year&0x0f高位半字节,这是高位半字节的实际值。为了获得更低的半字节值,我们需要清除更高的半字节值,以便我们使用<comp name = "a"> <subcomp1 name = "a1"> <subcomp2 name = "a2"/> </subcomp1> <subcomp3 name="a3/> </comp>

答案 2 :(得分:0)

首先:0x1521(5 x 16 ^ 0)+(1 x 16 ^ 1),而不是15。

其次,试试:

UINT8 year = 0x15;
printf("%d",year);

这是因为,没有值保存为十六进制或十进制,但最终保存为二进制。您使用的十六进制只是将系统转换为二进制的表示形式,如21

使它输出15可能会非常困难,并使你甚至以十六进制超级输入它。它就像进入21并要求我们设法让系统知道你的意思15

如果你从某个东西得到一个十六进制的值,请尝试将其转换为一个字符串,然后切断它的0x部分。

例如,如果您将0x15作为值,则只需将其作为字符串读取,然后使用字符串操作切断0x。

答案 3 :(得分:0)

如果0x15(十六进制)表示15(十进制),那么您可能正在处理BCD format中的输入。

在这种情况下,从BCD转换为十进制(1)是通过提取输入的每个nible并正确添加它们来完成的。
我们的输入是一个8位的字节 4个较少有意义的位(较低的半字节)表示单位,从0到9的数字。从不使用从A到F(十六进制)的值。
4个最有意义的位(高位半字节)代表十位。也是0到9之间的数字。

如果你提取它们,你会得到小数(1)值的公式:tens * 10 + units 我们可以使用二进制掩码获得较低的半字节:year & 0x0F
并且上半字节具有右移和相同的二元掩模:(year>>4) & 0x0F
整个代码是:

UINT8 year = 0x15;
assert ( ( (year>>4) & 0x0F ) < 10 );  // Ensure top nibble correctness
assert ( (year & 0x0F) < 10);         // Ensure low nibble correcness
int yearBin = ( (year>>4) & 0x0F ) * 10 + (year&0x0F);
printf("%d\n", (int)yearBin); // Print yearBin in decimal : 15 will be printed
printf("%x\n", (int)yearBin); // Print yearBin in hexadecimal :
                        // 0x15 will not be printed. 0xF will be printed.

(1)实际上,我们没有将BCD转换为十进制。我们正在从BCD转换为二进制(最有可能是2补码)。它是printf中转换参数的选择,是以十进制打印的。

答案 4 :(得分:0)

“不包含字母的十六进制值”为Binary Coded Decimal(BCD)。您可以像这样将BCD转换为十进制

#include <stdio.h>
#include <stdint.h>

uint8_t bcd2dec(uint8_t bcdval)
{
    return (bcdval >> 4) * 10 + (bcdval & 0xF);
}

int main(int argc, char *argv[])
{
    printf("Day   %u\n", bcd2dec(0x13));
    printf("Month %u\n", bcd2dec(0x10));
    printf("Year  %u\n", bcd2dec(0x15));
    return 0;
}

节目输出:

Day   13
Month 10
Year  15

答案 5 :(得分:0)

所以,如果我理解正确,你想从0x15得到15。

您可以使用以下方法:

char buffer[4];
UINT8 year = 0x15;

sprintf(buffer, "%x", year);

如果你打印缓冲区,你会得到一个字符串“15”。然后你可以这样做:

UINT8 decYear = atoi(buffer);