BCD碼 十六進製制與十進位制互轉

2021-05-26 01:13:51 字數 4899 閱讀 7076

在做嵌入式軟體的設計中,經常會遇到十六進製制、bcd碼與十進位制之間的轉換,最近做m1卡的應用中,涉及了大量的十六進製制、bcd碼與十進位制之間的轉換。筆者通過對bcd碼、十六進製制 權的理解,輕鬆的實現了他們之間的互換。

#include

#include

//功能:二進位製取反

//輸入:const unsigned char *src  二進位制資料

//      int length                待轉換的二進位制資料長度

//輸出:unsigned char *dst        取反後的二進位制資料

//返回:0    success

int convert(unsigned char *dst, const unsigned char *src, int length)

int i;

for(i=0; i

dst[i] = src[i]^0xff;

return 0;

//功能:十六進製制轉為十進位制

//輸入:const unsigned char *hex         待轉換的十六進製制資料

//      int length                       十六進製制資料長度

//輸出:

//返回:int  rslt                        轉換後的十進位制資料

//思路:十六進製制每個字元位所表示的十進位制數的範圍是0 ~255,進製為256

//      左移8位(<<8)等價乘以256

unsigned long hextodec(const unsigned char *hex, int length)

int i;

unsigned long rslt = 0;

for(i=0; i

rslt += (unsigned long)(hex[i])<<(8*(length-1-i));

return rslt;

//功能:十進位制轉十六進製制

//輸入:int dec                     待轉換的十進位制資料

//      int length                  轉換後的十六進製制資料長度

//輸出:unsigned char *hex          轉換後的十六進製制資料

//返回:0    success

//思路:原理同十六進製制轉十進位制

int dectohex(int dec, unsigned char *hex, int length)

int i;

for(i=length-1; i>=0; i--)

hex[i] = (dec%256)&0xff;

dec /= 256;

return 0;

//功能:求權

//輸入:int base                    進製基數

//      int times                   權級數

//輸出:

//返回:unsigned long               當前資料位的權

unsigned long power(int base, int times)

int i;

unsigned long rslt = 1;

for(i=0; i

rslt *= base;

return rslt;

//功能:bcd轉10進製

//輸入:const unsigned char *bcd     待轉換的bcd碼

//      int length                   bcd碼資料長度

//輸出:

//返回:unsigned long               當前資料位的權

//思路:壓縮bcd碼乙個字元所表示的十進位制資料範圍為0 ~ 99,進製為100

//      先求每個字元所表示的十進位制值,然後乘以權

unsigned long  bcdtodec(const unsigned char *bcd, int length)

int i, tmp;

unsigned long dec = 0;

for(i=0; i

tmp = ((bcd[i]>>4)&0x0f)*10 + (bcd[i]&0x0f);  

dec += tmp * power(100, length-1-i);         

return dec;

//功能:十進位制轉bcd碼

//輸入:int dec                      待轉換的十進位制資料

//      int length                   bcd碼資料長度

//輸出:unsigned char *bcd           轉換後的bcd碼

//返回:0  success

//思路:原理同bcd碼轉十進位制

int dectobcd(int dec, unsigned char *bcd, int length)

int i;

int temp;

for(i=length-1; i>=0; i--)

temp = dec%100;

bcd[i] = ((temp/10)<<4) + ((temp%10) & 0x0f);

dec /= 100;

return 0;

int main()

register int i;

unsigned char tmp_bff[12] = "";

//十六進製制轉十進位制

unsigned char hex[4] = ;

unsigned long dec_hex = 0;

dec_hex = hextodec(hex, 4);

printf("dec_hex = %d/n", dec_hex);

//十進位制轉十六進製制

dectohex(dec_hex, tmp_bff, 4);

for(i=0; i<5; i++)

printf("tmp_bff[%d] = 0x%02x/n",i, tmp_bff[i]);

// bcd碼轉十進位制

unsigned long dec_bcd = 0;

unsigned char bcd[4] = ;

dec_bcd = bcdtodec(bcd, 4);

printf("dec_bcd = %d/n", dec_bcd);

//十進位制轉bcd碼

dectobcd(dec_bcd, tmp_bff, 4);

for(i=0; i<5; i++)

printf("tmp_bff[%d] = 0x%02x/n", i, tmp_bff[i]);

getchar();

ascii 轉16進製制 和 16進製制轉ascii 

int hex2ascii(const char *hex,char * ascii)             //16進製制轉ascii

int len = strlen(hex), tlen, i, cnt;

for (i = 0, cnt = 0, tlen = 0; ichar c = toupper(hex[i]);

if ((c>='0'&& c<='9') || (c>='a'&& c<='f'))

byte t = (c >= 'a') ? c - 'a' + 10 : c - '0';

if (cnt)

ascii[tlen++] += t, cnt = 0;

else

ascii[tlen] = t << 4, cnt = 1;

return tlen;

int ascii2hex(char* ascii, char* hex)                 //ascii 轉16進製制

int i, len = strlen(ascii);

char chhex = "0123456789abcdef";

for (i = 0; ihex[i*3] = chhex[((byte)ascii[i]) >> 4];

hex[i*3 +1] = chhex[((byte)ascii[i]) & 0xf];

hex[i*3 +2] = ' ';

hex[len * 3] = '/0';

return len * 3;

//這是乙個將字元轉換為相應的十六進製制值的函式   

//功能:若是在0-f之間的字元,則轉換為相應的十六進製制字元,否則返回-1   

char   cmicdlg::converthexchar(char   ch)     

if((ch>='0')&&(ch<='9'))   

return   ch-0x30;   

else   if((ch>='a')&&(ch<='f'))   

return   ch-'a'+10;   

else   if((ch>='a')&&(ch<='f'))   

return   ch-'a'+10;   

else   return   (-1);   

//如果cstring型別變數的值為"067b",我想將其轉換成16進製制整數的067b ?

先把cstring   轉換成char型   

char   szbuf="06b";   

int   n;   

sscanf(szbuf,"%x",&n);   

n就是你要的結果

cstring不用轉也可以   

cstring   strbuf;   

int   n;   

sscanf(strbuf.getbuffer(strbuf.getlength()),"%x",&n);   

strbuf.releasebuffer();  

BCD碼 十六進製制 十進位制 互轉

include include 功能 二進位製取反 輸入 const unsigned char src 二進位制資料 int length 待轉換的二進位制資料長度 輸出 unsigned char dst 取反後的二進位制資料 返回 0 success int convert unsigned ...

BCD碼 十六進製制與十進位制互轉

在做嵌入式軟體的設計中,經常會遇到十六進製制 bcd碼與十進位制之間的轉換,最近做m1卡的應用中,涉及了大量的十六進製制 bcd碼與十進位制之間的轉換。筆者通過對bcd碼 十六進製制 權的理解,輕鬆的實現了他們之間的互換。include include 功能 二進位製取反 輸入 const unsi...

BCD碼 十六進製制與十進位制互轉

在做嵌入式軟體的設計中,經常會遇到十六進製制 bcd碼與十進位制之間的轉換,最近做m1卡的應用中,涉及了大量的十六進製制 bcd碼與十進位制之間的轉換。筆者通過對bcd碼 十六進製制 權的理解,輕鬆的實現了他們之間的互換。include include 功能 二進位製取反 輸入 const unsi...