2012-10-09 60 views
0

如何在不使用sprintf的情況下在C中實現這些轉換?C - 將十進制數轉換爲壓縮BCD

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,×09}但我希望它是{0×12,0×10,×09}

+0

我會毫不猶豫地稱之爲「轉換」。 –

回答

5

對於有限的2-您正在使用的數字範圍:

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

如果這對您更有意義,您可以將其表示爲((year/10) << 4) | (year % 10)

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; 

}

0

我在我的PIC單片機使用RTCC時,發現了同樣的困難。 它在某個字節中存儲從0到99的值並將低位和高位nybble用作十進制值的方式很常見。

所以從一個字符二進制半字節可能是:在常規的二進制 (https://www.google.nl/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=0b00010010+to+decimal)編碼時

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

儘管00010010將18

我用下面的代碼來解決這個問題。

#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); 
} 
相關問題