全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:6705
推到 Plurk!
推到 Facebook!

請問如何用 C 語言做 HEX 和 BCD 之間的轉換

答題得分者是:bernie_w39
PSIR
初階會員


發表:106
回覆:51
積分:31
註冊:2008-01-03

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-03-20 10:35:12 IP:203.70.xxx.xxx 訂閱
例如現在有一個數值為十進制的 12,
我希望呼叫一個函數運算後變成16進制的 0X12,
反之也可以轉換回來,
請問這是不是所謂的 HEX 和 BCD 的轉換,
如何用 C 語言要如何實現 HEX TO BCD
和 BCD TO HEX 這兩個函數,
謝謝。
編輯記錄
taishyang 重新編輯於 2009-03-20 10:43:03, 註解 歸類成[問題]‧
bernie_w39
資深會員


發表:3
回覆:199
積分:280
註冊:2007-10-07

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-03-20 20:59:46 IP:118.166.xxx.xxx 訂閱
有一個作法不錯, 叫作 shift plus 3, 剛才想 google 一下有沒有 source code,
結果沒看到了. 也許是我記錯名字了. 順手寫了一個 C 的程式, 供參考

hex to bcd

[code cpp]

#include
#include

typedef union
{
unsigned int v;
unsigned char b[sizeof(unsigned int)];
}
data_t;

int main(int argc, char **argv)
{
data_t s, d;
int i, j, o;
if (argc != 2)
{
printf("Usage: %s {hex value}\n", argv[0]);
return 0;
}
s.v = o = atoi(argv[1]);

// shift-plus-3
d.v = 0;
for (i = 0; i < sizeof(d) * 8; i )
{
for (j = 0; j < sizeof(d); j )
{
if ((d.b[j] 0x30) & 0x80)
d.b[j] = 0x30;
if ((d.b[j] 0x03) & 0x08)
d.b[j] = 0x03;
}
d.v <<= 1;
d.v |= (s.v >> (sizeof(s) * 8 - 1));
s.v <<= 1;
}

printf("source = %d, destination = %x\n", o, d);
return 0;
}
[/code]


bcd to hex

[code cpp]

#include
#include

typedef union
{
unsigned int v;
unsigned char b[sizeof(unsigned int)];
}
data_t;

int main(int argc, char **argv)
{
data_t s, d;
int i, j, o;
if (argc != 2)
{
printf("Usage: %s {hex value}\n", argv[0]);
return 0;
}
s.v = o = atoi(argv[1]);

// shift-plus-3
d.v = 0;
for (i = 0; i < sizeof(d) * 8; i )
{
d.v >>= 1;
d.v |= (s.v << (sizeof(s) * 8 - 1));
s.v >>= 1;
for (j = 0; j < sizeof(s); j )
{
if (s.b[j] & 0x80)
s.b[j] -= 0x30;
if (s.b[j] & 0x08)
s.b[j] -= 0x03;
}
}

printf("source = %x, destination = %d\n", o, d);
return 0;
}
[/code]
編輯記錄
bernie_w39 重新編輯於 2009-03-20 21:01:29, 註解 無‧
src
高階會員


發表:1
回覆:94
積分:154
註冊:2005-08-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-03-21 20:05:39 IP:61.216.xxx.xxx 訂閱

[code delphi]
unsigned char hex_bcd(unsigned char temp)
{
return ((temp/10)*16) (temp);
}
unsigned char bcd_hex(unsigned char temp)
{
return ((temp>>4)*10) (temp&0x0f);
}
main(void)
{
unsigned char byte;
byte=hex_bcd(12);
byte=bcd_hex(0x12);
}[/code]

===================引 用 PSIR 文 章===================
例如現在有一個數值為十進制的 12,
我希望呼叫一個函數運算後變成16進制的 0X12,
反之也可以轉換回來,
請問這是不是所謂的 HEX 和 BCD 的轉換,
如何用 C 語言要如何實現 HEX TO BCD
和 BCD TO HEX 這兩個函數,
謝謝。
brent77622
一般會員


發表:2
回覆:3
積分:1
註冊:2009-07-23

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-07-24 12:19:39 IP:203.64.xxx.xxx 訂閱
可以請問一下原理嗎??
我用VC 編譯時會出現 error C3861: 'atoi': 找不到識別項
我想用手動輸入 例如輸入 0F (型態為字串)
可是我想把它變成 0x0F 並且放入陣列裡面
請個位大大解惑 !! 謝謝!
系統時間:2024-04-26 13:15:57
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!