0

如何在不使用 sprintf 的情况下在 C 中实现这些转换?

20 => 0x20
12 => 0x12

目前我有:

int year = 12;
int month = 10;
int day = 9;
unsigned char date[3];

date[0] = year & 0xFF;
date[1] = month & 0xFF;
date[2] = day & 0xFF;

日期将包含 { 0x0C, 0x0A, 0x09 } 但我希望它是 { 0x12, 0x10, 0x09 }

4

3 回答 3

6

您只需要以十进制为基数检索每个数字,然后将其乘以十六进制的等效数字。

#include <stdio.h>

int hex(int v){
int total = 0;
int resultbase = 1;
while(v > 0 ){
    total += resultbase * (v % 10);
    resultbase *= 16;
    v /= 10;
}

return total;
}

 int  main(){
printf ("12 => %x, 20 => %x\n", hex(12), hex(20));
return 0;

}

于 2012-10-09T10:53:03.873 回答
5

对于您使用的有限的 2 位数范围:

assert(year >= 0 && year < 100);
date[0] = (year / 10) * 16 + (year % 10);

等等

你可以表达它,((year / 10) << 4) | (year % 10)好像这对你来说更有意义。

于 2012-10-09T10:50:26.427 回答
0

在我的 PIC 单片机上使用 RTCC 时,我发现了同样的困难。以某种方式将 0 到 99 的值存储在一个字节中并使用较低和较高的 nybble 作为十进制值是很常见的。

所以来自 char 的二进制 nybbles 可能是:

0001 0010 (Binary BCD coded value)
 1    2   (Decimal BCD representation) ^ That would be 12 BCD but 18 Binary

虽然 00010010 以常规二进制编码时为 18(https://www.google.nl/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=0b00010010+to+decimal

我使用下面的代码来解决这个问题。

#define HI_NIBBLE(b) (((b) >> 4) & 0x0F)
#define LO_NIBBLE(b) ((b) & 0x0F)

char BcdToDecimal(char bcd){
    return (char)((HI_NIBBLE(bcd)*10)+(LO_NIBBLE(bcd)));
}

char DecimalToBcd(char decimal){
    return (char) ((decimal / 10)*16)+(decimal % 10);
}
于 2015-03-27T09:52:08.600 回答