博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
以下代码将字符串形式的尺寸描述转换成字节数
阅读量:6242 次
发布时间:2019-06-22

本文共 3464 字,大约阅读时间需要 11 分钟。

1 #include 
2 3 #define SECTOR_SIZE_DEFAULT 512LL 4 #define KILOBYTE_SIZE 1000LL 5 #define MEGABYTE_SIZE 1000000LL 6 #define GIGABYTE_SIZE 1000000000LL 7 #define TERABYTE_SIZE 1000000000000LL 8 #define KIBIBYTE_SIZE 1024LL 9 #define MEBIBYTE_SIZE 1048576LL 10 #define GIBIBYTE_SIZE 1073741824LL 11 #define TEBIBYTE_SIZE 1099511627776LL 12 13 typedef enum { 14 DIGIT_UNIT_BYTE, 15 DIGIT_UNIT_KILOBYTE, 16 DIGIT_UNIT_MEGABYTE, 17 DIGIT_UNIT_GIGABYTE, 18 DIGIT_UNIT_TERABYTE, 19 DIGIT_UNIT_KIBIBYTE, 20 DIGIT_UNIT_MEBIBYTE, 21 DIGIT_UNIT_GIBIBYTE, 22 DIGIT_UNIT_TEBIBYTE 23 } DigitUnit; 24 25 /* Inefficiently removes all spaces from a string, in-place. */ 26 static void 27 strip_string (char* str) 28 { 29 int i; 30 31 for (i = 0; str[i] != 0; i++) { 32 if (isspace (str[i])) { 33 int j; 34 for (j = i + 1; str[j] != 0; j++) 35 str[j - 1] = str[j]; 36 } 37 } 38 } 39 40 /* Find non-number suffix. Eg: find_suffix("32Mb") returns a pointer to 41 * "Mb". */ 42 static char* 43 find_suffix (const char* str) 44 { 45 while (str[0] != 0 && (isdigit (str[0]) || strchr(",.-", str[0]))) 46 str++; 47 return (char *) str; 48 } 49 50 static DigitUnit 51 parse_unit_suffix (const char* suffix) 52 { 53 if (strlen (suffix) > 1 && tolower (suffix[1]) == 'i') { 54 switch (tolower (suffix[0])) { 55 case 'k': return DIGIT_UNIT_KIBIBYTE; 56 case 'm': return DIGIT_UNIT_MEBIBYTE; 57 case 'g': return DIGIT_UNIT_GIBIBYTE; 58 case 't': return DIGIT_UNIT_TEBIBYTE; 59 } 60 } else if (strlen (suffix) > 0) { 61 switch (tolower (suffix[0])) { 62 case 'b': return DIGIT_UNIT_BYTE; 63 case 'k': return DIGIT_UNIT_KILOBYTE; 64 case 'm': return DIGIT_UNIT_MEGABYTE; 65 case 'g': return DIGIT_UNIT_GIGABYTE; 66 case 't': return DIGIT_UNIT_TERABYTE; 67 } 68 } 69 70 return -1; 71 } 72 73 long long unit_parse (const char *str) 74 { 75 char *suffix; 76 long long byte = -1; 77 long long byte_block = 1; 78 79 strip_string (str); 80 suffix = find_suffix (str); 81 82 DigitUnit unit = parse_unit_suffix (suffix); 83 84 switch (unit) { 85 case DIGIT_UNIT_BYTE: 86 break; 87 case DIGIT_UNIT_KILOBYTE: 88 byte_block = KILOBYTE_SIZE; 89 break; 90 case DIGIT_UNIT_MEGABYTE: 91 byte_block = MEGABYTE_SIZE; 92 break; 93 case DIGIT_UNIT_GIGABYTE: 94 byte_block = GIGABYTE_SIZE; 95 break; 96 case DIGIT_UNIT_TERABYTE: 97 byte_block = TERABYTE_SIZE; 98 break; 99 case DIGIT_UNIT_KIBIBYTE:100 byte_block = KIBIBYTE_SIZE;101 break;102 case DIGIT_UNIT_MEBIBYTE:103 byte_block = MEBIBYTE_SIZE;104 break;105 case DIGIT_UNIT_GIBIBYTE:106 byte_block = GIBIBYTE_SIZE;107 break;108 case DIGIT_UNIT_TEBIBYTE:109 byte_block = TEBIBYTE_SIZE;110 break;111 }112 113 double temp = 0;114 if (sscanf (str, "%lf", &temp) == 1)115 byte = temp * byte_block;116 117 return byte;118 }119 120 121 int main (int argc, char **argv)122 {123 if (argc > 1)124 printf ("%lld\n", unit_parse (argv[1]));125 return 0;126 }

 

转载于:https://www.cnblogs.com/the-capricornus/p/4064697.html

你可能感兴趣的文章
webdynpro的select_option示例
查看>>
img src 使用 base64 图片数据
查看>>
MapReduce计算每年最高温度
查看>>
Ruby快速入门
查看>>
UVA 12118 Inspector's Dilemma(连通性,欧拉路径,构造)
查看>>
一台电脑同时运行多个tomcat配置方法
查看>>
让文本框只能输入数字
查看>>
pwnable.kr 之 passcode write up
查看>>
多任务之协程浅谈
查看>>
Qt Creator快捷键
查看>>
idea中lombok的使用
查看>>
网站集成支付宝在线支付
查看>>
mac下安装appium
查看>>
js ---- 函数防抖
查看>>
js call 和 apply
查看>>
CentOS 6.5下Percona Xtrabackup的安装错误解决方案
查看>>
VCS双机+oracle 11gR2+ASM主机名修改
查看>>
转:// LINUX下为ORACLE数据库设置大页--hugepage
查看>>
Linux文件权限与属性详解 之 chattr & lsattr
查看>>
负载均衡集群之LVS配置命令
查看>>