Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2116709
  • 博文数量: 438
  • 博客积分: 3871
  • 博客等级: 中校
  • 技术积分: 6075
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-10 00:11
个人简介

邮箱: wangcong02345@163.com

文章分类

全部博文(438)

文章存档

2017年(15)

2016年(119)

2015年(91)

2014年(62)

2013年(56)

2012年(79)

2011年(16)

分类: LINUX

2015-11-17 11:43:33

1.代码
  1. #include "utils.h"

  2. long long htoi(const char* s, int len)
  3. {
  4.     int i;
  5.     long long n = 0;
  6.     //现在保证s中是合法的并且都是小写的16进制字符串了,直接转就可以了
  7.     for (i=0; i<len; i++)
  8.     {
  9.         if (s[i] > '9')
  10.         {
  11.             n = 16*n + (10+ s[i]-'a');
  12.         }
  13.         else
  14.         {
  15.             n = 16*n + s[i]-'0';
  16.         }
  17.     }
  18.     return n;
  19. }

  20. int check_and_tran(char *d, char* s, int len)
  21. {
  22.     int i;
  23.     //把去掉字符串开头的0x或0X,拷贝到d中
  24.     if (s[0] == '0' && (s[1]=='x' || s[1]=='X')) //0x or 0X, prefix
  25.         i=2;
  26.     else
  27.         i=0;
  28.     strncpy(d, s+i, len-i);
  29.     //printf("before d=%s\n", d);
  30.    
  31.     //判断d中是不是合法字符,并把其中的大写字母转小写
  32.     for(i=0; i<strlen(d); i++)
  33.     {
  34.         // printf("%d=%c ", i, d[i]);
  35.         if( !((d[i]>='0' && d[i]<='9') || (d[i]>='a' && d[i]<='f') || (d[i]>='A' && d[i]<='F')) )
  36.         {
  37.             printf("not a valid hex string\n");
  38.             return -1;
  39.         }
  40.         if(d[i]>='A' && d[i]<='F')
  41.             d[i] += 'a' - 'A';
  42.     }
  43.     //printf("d=%s\n", d);
  44.     return 0;
  45. }

  46. int main ( int argc, char *argv[] )
  47. {
  48.     int ret;
  49.     char buf[1024];
  50.     int len;
  51.     long long num;
  52.     if(argc < 2)
  53.     {
  54.         printf("./cal \n");
  55.         return -1;
  56.     }
  57.     memset(buf, 0 , 1024);
  58.     //1. 先检查传入的字符串是否是合法的16进制字符串
  59.     //把字符串中的A-F转为a-f,转为小写字母
  60.     ret = check_and_tran(buf, argv[1], strlen(argv[1]));
  61.     if(ret < 0)
  62.         return -1;
  63.     
  64.     //2. 将16进制字符串转为10进制的数
  65.     num = htoi(buf, strlen(buf));

  66.     //3.最后按照合适的顺序打印出来
  67.     printf("0x%s=%lld\t", buf,num);
  68.     if(num > 1024)
  69.         printf("%lfK\t",(double)((double)num/1024));
  70.     if(num > 1024*1024)
  71.         printf("%lfM\t",(double)((double)num/1024/1024));
  72.     if(num > 1024*1024*1024)
  73.         printf("%lfG\t",(double)((double)num/1024/1024/1024));
  74.     printf("\n\n");
  75.     return EXIT_SUCCESS;
  76. }
2. 代码打包
calculator.rar(下载后改改为calculator.tar.gz)
3. 实验结果
  1. cong@msi:/work/test/calculator$ ./cal E4B00010
  2. e4b00010=3836739600    3746816.015625K    3659.000015M    3.573242G    

  3. cong@msi:/work/test/calculator$ ./cal 1234
  4. 1234=4660    4.550781K

阅读(2238) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~