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();  

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值