9

如何在表示方面将二进制编码的十进制数转换为十进制数?我不想转换它的值,而是转换它的表示,这就是我的意思。

我想转换0x11为十进制11(非17)和0x202032)。

unsigned char day = 0x11;
unsigned char month = 0x12;

int dayDecimal, monthDecimal;

我希望 dayDecimal11和 monthDecimal = 12。我将使用 0x00 到 0x60 之间的范围,所以它应该是可能的。不会有“A”、“B”、“C”、“D”、“E”、“F”。

更新:

作为我正在从事的嵌入式项目的一部分,我实际上是从 RTCC 芯片读取时间。小时、分钟、日和月以该形式返回。例如,如果分钟是 0x40,那么它意味着 40 分钟而不是 64,所以我需要能够正确地保持对它的解释。我需要以某种方式将 0x40 转换为 40 而不是 64。我希望这是可能的。

谢谢!

4

3 回答 3

18

您需要使用两个 nybbles,将更重要的 nybble 乘以 10 并添加不太重要的 nybble:

uint8_t hex = 0x11;
assert(((hex & 0xF0) >> 4) < 10);  // More significant nybble is valid
assert((hex & 0x0F) < 10);         // Less significant nybble is valid
int dec = ((hex & 0xF0) >> 4) * 10 + (hex & 0x0F);

如果断言被禁用但输入是虚假的(例如 0xFF),你会得到你应得的:GIGO - 垃圾输入,垃圾输出。您可以轻松地将其包装到(内联)函数中:

static inline int bcd_decimal(uint8_t hex)
{
    assert(((hex & 0xF0) >> 4) < 10);  // More significant nybble is valid
    assert((hex & 0x0F) < 10);         // Less significant nybble is valid
    int dec = ((hex & 0xF0) >> 4) * 10 + (hex & 0x0F);
    return dec;
}       

这种转换让人想起 BCD —二进制编码的十进制

于 2015-01-25T03:54:58.477 回答
9

一个没有错误检查的非常简单的方法:

int bcd_to_decimal(unsigned char x) {
    return x - 6 * (x >> 4);
}
于 2017-02-20T09:00:59.757 回答
1

将所需的值放入函数中,您将得到一个整数作为回报。

#include <stdio.h>
#include <math.h>

typedef int                 INT32;

typedef short int           INT16;

typedef unsigned short int  UINT16;

typedef unsigned long int   UINT32;

UINT32 BCDToDecimal(UINT32 nDecimalValue){
    UINT32 nResult=0;
    INT32  nPartialRemainder, ncnt,anHexValueStored[8];
    UINT16 unLengthOfHexString = 0,unflag=0;

    for(ncnt=7 ;ncnt>=0 ; ncnt--){
        anHexValueStored[ncnt]=nDecimalValue & (0x0000000f << 4*(7-ncnt));
        anHexValueStored[ncnt]=anHexValueStored[ncnt] >> 4*(7-ncnt);
        if(anHexValueStored[ncnt]>9)
        unflag=1;
    }
    if(unflag==1){
        return 0;
    }
    else{
        for(ncnt=0 ;ncnt<8 ; ncnt++)
        nResult= nResult +anHexValueStored[ncnt]*pow(10,(7-ncnt));
        return nResult;
    }
}
int main() {
    printf("%ld\n",BCDToDecimal(0X20));
    return 0;
}
于 2017-07-14T07:40:42.443 回答