免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 9868 | 回复: 2
打印 上一主题 下一主题

[函数] 很好的16进制、10进制、2进制字符串的转换函数! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-04-15 21:17 |只看该作者 |倒序浏览
  1. #include <stdio.h>;
  2. #include <string.h>;
  3. #include <stdlib.h>;

  4. /*
  5. *        10进制字符转成16进制字符
  6. */
  7. int strDec2Hex(char* sDec,int iDecLen,char* sHex,int iHexLen)
  8. {
  9.         char sSrc[65];
  10.         char sForamt[6];
  11.         unsigned long ulSrc;
  12.         memset(sSrc,0,sizeof(sSrc));
  13.         memcpy(sSrc,sDec,iDecLen);
  14.         ulSrc = atol(sSrc);
  15.         sprintf(sForamt,"%%0%dX",iHexLen);
  16.         _snprintf(sHex,iHexLen,sForamt,ulSrc);
  17.         return ulSrc;
  18. }
  19. /*
  20. *        2进制字符转成16进制字符
  21. */
  22. int strBin2Hex(char* sBin,int iBinLen,char* sHex,int iHexLen)
  23. {
  24.         char sSrc[65];
  25.         char sForamt[6];
  26.         unsigned long ulSrc;
  27.         memset(sSrc,0,sizeof(sSrc));
  28.         memcpy(sSrc,sBin,iBinLen);
  29.         *(sSrc+0)=='1'?ulSrc=1:ulSrc=0;
  30.         for(int i=1;i<iBinLen;i++)
  31.                 *(sSrc+i)=='1'?ulSrc=ulSrc*2+1:ulSrc=ulSrc*2+0;
  32.         sprintf(sForamt,"%%0%dX",iHexLen);
  33.         _snprintf(sHex,iHexLen,sForamt,ulSrc);
  34.         return ulSrc;
  35. }

  36. /*
  37. *        16进制字符转成10进制字符
  38. */
  39. int strHex2Dec(char* sHex,int iHexLen,char* sDec,int iDecLen)
  40. {
  41.         char sSrc[65];
  42.         char sForamt[6];
  43.         unsigned long ulSrc;
  44.         memset(sSrc,0,sizeof(sSrc));
  45.         memcpy(sSrc,sHex,iHexLen);
  46.         strupr(sSrc);
  47.         *(sSrc+0)<'A'?ulSrc=*(sSrc+0)-0x30:ulSrc=*(sSrc+0)-0x41+0x0A;
  48.         for(int i=1;i<iHexLen;i++)
  49.                 *(sSrc+i)<'A'?ulSrc=ulSrc*16+*(sSrc+i)-0x30:ulSrc=ulSrc*16+*(sSrc+i)-0x41+0x0A;
  50.         sprintf(sForamt,"%%0%du",iDecLen);
  51.         _snprintf(sDec,iDecLen,sForamt,ulSrc);
  52.         return ulSrc;
  53. }

  54. /*
  55. *        16进制字符转成2进制字符
  56. */
  57. int strHex2Bin(char* sHex,int iHexLen,char* sBin,int iBinLen)
  58. {
  59.         char sSrc[65];
  60.         char sForamt[6];
  61.         unsigned long ulSrc;
  62.         memset(sSrc,0,sizeof(sSrc));
  63.         memcpy(sSrc,sHex,iHexLen);
  64.         *(sSrc+0)<'A'?ulSrc=*(sSrc+0)-0x30:ulSrc=*(sSrc+0)-0x41+0x0A;
  65.         for(int i=1;i<iHexLen;i++)
  66.                 *(sSrc+i)<'A'?ulSrc=ulSrc*16+*(sSrc+i)-0x30:ulSrc=ulSrc*16+*(sSrc+i)-0x41+0x0A;
  67.         sprintf(sForamt,"%%0%dd",iBinLen);
  68.         memset(sSrc,0,sizeof(sSrc));
  69.         ultoa(ulSrc,sSrc,2);
  70.         sprintf(sForamt,"%%0%ds",iBinLen);
  71.         _snprintf(sBin,iBinLen,sForamt,sSrc);
  72.         return ulSrc;
  73. }



  74. void main()
  75. {
  76.        
  77.         char strCh[60];
  78.         memset(strCh,0,sizeof(strCh));
  79.         strDec2Hex("244",3,strCh,2);
  80.         //sprintf(strCh,"%X",101);
  81.         printf("10to16:%s\n",strCh);
  82.        
  83.         memset(strCh,0,sizeof(strCh));
  84.         strHex2Dec("0F",2,strCh,3);
  85.         printf("16to10:%s\n",strCh);
  86.        
  87.         //printf("%0|\n",)

  88.         int wi=1,wj=0,wk;
  89.         wk=wi^wj;
  90.         printf("wk:%d\n",wk);

  91. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2004-04-15 23:30 |只看该作者

很好的16进制、10进制、2进制字符串的转换函数!

好么?这句就罗嗦嘛:
sprintf(sForamt,"%%0%dX",iHexLen);
_snprintf(sHex,iHexLen,sForamt,ulSrc);

直接
_snprintf(sHex,iHexLen+1,"%0*X",iHexLen,ulSrc);
就行了。

此外,诸如返回码类型不匹配等的问题也存在,就看了一个函数,就发现这么多问题……不说也罢

论坛徽章:
0
3 [报告]
发表于 2004-04-16 09:26 |只看该作者

很好的16进制、10进制、2进制字符串的转换函数!

好像不全啊,ultoa和strupr没定义,这不是标准函数吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP