BCD碼、十六進制與十進制互轉(轉載),其他轉換

轉自 http://blog.csdn.net/zsm180/archive/2008/11/20/3342324.aspx

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

  1. #include
  2. #include
  3. /////////////////////////////////////////////////////
  4. //
  5. //功能:二進制取反
  6. //
  7. //輸入:const unsigned char *src  二進制數據
  8. //      int length                待轉換的二進制數據長度
  9. //
  10. //輸出:unsigned char *dst        取反後的二進制數據
  11. //
  12. //返回:0    success
  13. //
  14. //////////////////////////////////////////////////////
  15. int convert(unsigned char *dst, const unsigned char *src, int length)
  16. {
  17. int i;
  18. for(i=0; i
  19.         {
  20.                 dst[i] = src[i]^0xFF;
  21.         }
  22. return 0;
  23. }
  24. //////////////////////////////////////////////////////////
  25. //
  26. //功能:十六進制轉爲十進制
  27. //
  28. //輸入:const unsigned char *hex         待轉換的十六進制數據
  29. //      int length                       十六進制數據長度
  30. //
  31. //輸出:
  32. //
  33. //返回:int  rslt                        轉換後的十進制數據
  34. //
  35. //思路:十六進制每個字符位所表示的十進制數的範圍是0 ~255,進製爲256
  36. //      左移8位(<<8)等價乘以256
  37. //
  38. /////////////////////////////////////////////////////////
  39. unsigned long HextoDec(const unsigned char *hex, int length)
  40. {
  41. int i;
  42.     unsigned long rslt = 0;
  43. for(i=0; i
  44.     {
  45.         rslt += (unsigned long)(hex[i])<<(8*(length-1-i));
  46.     }
  47. return rslt;
  48. }
  49. /////////////////////////////////////////////////////////
  50. //
  51. //功能:十進制轉十六進制
  52. //
  53. //輸入:int dec                     待轉換的十進制數據
  54. //      int length                  轉換後的十六進制數據長度
  55. //
  56. //輸出:unsigned char *hex          轉換後的十六進制數據
  57. //
  58. //返回:0    success
  59. //
  60. //思路:原理同十六進制轉十進制
  61. //////////////////////////////////////////////////////////
  62. int DectoHex(int dec, unsigned char *hex, int length)
  63. {
  64. int i;
  65. for(i=length-1; i>=0; i--)
  66.     {
  67.         hex[i] = (dec%256)&0xFF;
  68.         dec /= 256;
  69.     }
  70. return 0;
  71. }
  72. /////////////////////////////////////////////////////////
  73. //
  74. //功能:求權
  75. //
  76. //輸入:int base                    進制基數
  77. //      int times                   權級數
  78. //
  79. //輸出:
  80. //
  81. //返回:unsigned long               當前數據位的權
  82. //
  83. //////////////////////////////////////////////////////////
  84. unsigned long power(int base, int times)
  85. {
  86. int i;
  87.     unsigned long rslt = 1;
  88. for(i=0; i
  89.         rslt *= base;
  90. return rslt;
  91. }
  92. /////////////////////////////////////////////////////////
  93. //
  94. //功能:BCD轉10進制
  95. //
  96. //輸入:const unsigned char *bcd     待轉換的BCD碼
  97. //      int length                   BCD碼數據長度
  98. //
  99. //輸出:
  100. //
  101. //返回:unsigned long               當前數據位的權
  102. //
  103. //思路:壓縮BCD碼一個字符所表示的十進制數據範圍爲0 ~ 99,進製爲100
  104. //      先求每個字符所表示的十進制值,然後乘以權
  105. //////////////////////////////////////////////////////////
  106. unsigned long  BCDtoDec(const unsigned char *bcd, int length)
  107. {
  108. int i, tmp;
  109.      unsigned long dec = 0;
  110. for(i=0; i
  111.      {
  112.         tmp = ((bcd[i]>>4)&0x0F)*10 + (bcd[i]&0x0F);  
  113.         dec += tmp * power(100, length-1-i);         
  114.      }
  115. return dec;
  116. }
  117. /////////////////////////////////////////////////////////
  118. //
  119. //功能:十進制轉BCD碼
  120. //
  121. //輸入:int Dec                      待轉換的十進制數據
  122. //      int length                   BCD碼數據長度
  123. //
  124. //輸出:unsigned char *Bcd           轉換後的BCD碼
  125. //
  126. //返回:0  success
  127. //
  128. //思路:原理同BCD碼轉十進制
  129. //
  130. //////////////////////////////////////////////////////////
  131. int DectoBCD(int Dec, unsigned char *Bcd, int length)
  132. {
  133. int i;
  134. int temp;
  135. for(i=length-1; i>=0; i--)
  136.      {
  137.          temp = Dec%100;
  138.          Bcd[i] = ((temp/10)<<4) + ((temp%10) & 0x0F);
  139.          Dec /= 100;
  140.      }
  141. return 0;
  142. }
  143. int main()
  144. {
  145. register int i;
  146.     unsigned char tmp_bff[12] = "";
  147. //十六進制轉十進制
  148.     unsigned char HEX[4] = {0x34, 0xFE, 0x3E, 0xFF};
  149.     unsigned long dec_hex = 0;
  150.     dec_hex = HextoDec(HEX, 4);
  151.     printf("dec_hex = %d/n", dec_hex);
  152. //十進制轉十六進制
  153.     DectoHex(dec_hex, tmp_bff, 4);
  154. for(i=0; i<5; i++)
  155.     {
  156.         printf("tmp_bff[%d] = 0x%02X/n",i, tmp_bff[i]);
  157.     }
  158. // BCD碼轉十進制
  159.     unsigned long dec_bcd = 0;
  160.     unsigned char BCD[4] = {0x98, 0x23, 0x45, 0x78};
  161.     dec_bcd = BCDtoDec(BCD, 4);
  162.     printf("dec_bcd = %d/n", dec_bcd);
  163. //十進制轉BCD碼
  164.     DectoBCD(dec_bcd, tmp_bff, 4);
  165. for(i=0; i<5; i++)
  166.     {
  167.         printf("tmp_bff[%d] = 0x%02X/n", i, tmp_bff[i]);
  168.     }
  169.     getchar();
  170. }

 

 

 

 

 

 

 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; i<len; i++)
 {
  char 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; i<len; i++)
 {
  hex[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();  

 

發佈了18 篇原創文章 · 獲贊 10 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章