以下代码将字符串形式的尺寸描述转换成字节数

#include <stdio.h>

#define SECTOR_SIZE_DEFAULT   512LL
#define KILOBYTE_SIZE 1000LL
#define MEGABYTE_SIZE 1000000LL
#define GIGABYTE_SIZE 1000000000LL
#define TERABYTE_SIZE 1000000000000LL
#define KIBIBYTE_SIZE 1024LL
#define MEBIBYTE_SIZE 1048576LL
#define GIBIBYTE_SIZE 1073741824LL
#define TEBIBYTE_SIZE 1099511627776LL

typedef enum {
    DIGIT_UNIT_BYTE,
    DIGIT_UNIT_KILOBYTE,
    DIGIT_UNIT_MEGABYTE,
    DIGIT_UNIT_GIGABYTE,
    DIGIT_UNIT_TERABYTE,
    DIGIT_UNIT_KIBIBYTE,
    DIGIT_UNIT_MEBIBYTE,
    DIGIT_UNIT_GIBIBYTE,
    DIGIT_UNIT_TEBIBYTE
} DigitUnit;

/* Inefficiently removes all spaces from a string, in-place. */
static void
strip_string (char* str)
{
    int i;

    for (i = 0; str[i] != 0; i++) {
        if (isspace (str[i])) {
            int j;
            for (j = i + 1; str[j] != 0; j++)
                str[j - 1] = str[j];
        }
    }
}

/* Find non-number suffix.  Eg: find_suffix("32Mb") returns a pointer to
 * "Mb". */
static char*
find_suffix (const char* str)
{
    while (str[0] != 0 && (isdigit (str[0]) || strchr(",.-", str[0])))
        str++;
    return (char *) str;
}

static DigitUnit
parse_unit_suffix (const char* suffix)
{
    if (strlen (suffix) > 1 && tolower (suffix[1]) == ‘i‘) {
        switch (tolower (suffix[0])) {
            case ‘k‘: return DIGIT_UNIT_KIBIBYTE;
            case ‘m‘: return DIGIT_UNIT_MEBIBYTE;
            case ‘g‘: return DIGIT_UNIT_GIBIBYTE;
            case ‘t‘: return DIGIT_UNIT_TEBIBYTE;
        }
    } else if (strlen (suffix) > 0) {
        switch (tolower (suffix[0])) {
            case ‘b‘: return DIGIT_UNIT_BYTE;
            case ‘k‘: return DIGIT_UNIT_KILOBYTE;
            case ‘m‘: return DIGIT_UNIT_MEGABYTE;
            case ‘g‘: return DIGIT_UNIT_GIGABYTE;
            case ‘t‘: return DIGIT_UNIT_TERABYTE;
        }
    }

    return -1;
}

long long unit_parse (const char *str)
{
    char *suffix;
    long long byte = -1;
    long long byte_block = 1;

    strip_string (str);
    suffix = find_suffix (str);

    DigitUnit unit = parse_unit_suffix (suffix);

    switch (unit) {
    case DIGIT_UNIT_BYTE:
        break;
    case DIGIT_UNIT_KILOBYTE:
        byte_block = KILOBYTE_SIZE;
        break;
    case DIGIT_UNIT_MEGABYTE:
        byte_block = MEGABYTE_SIZE;
        break;
    case DIGIT_UNIT_GIGABYTE:
        byte_block = GIGABYTE_SIZE;
        break;
    case DIGIT_UNIT_TERABYTE:
        byte_block = TERABYTE_SIZE;
        break;
    case DIGIT_UNIT_KIBIBYTE:
        byte_block = KIBIBYTE_SIZE;
        break;
    case DIGIT_UNIT_MEBIBYTE:
        byte_block = MEBIBYTE_SIZE;
        break;
    case DIGIT_UNIT_GIBIBYTE:
        byte_block = GIBIBYTE_SIZE;
        break;
    case DIGIT_UNIT_TEBIBYTE:
        byte_block = TEBIBYTE_SIZE;
        break;
    }

    double temp = 0;
    if (sscanf (str, "%lf", &temp) == 1)
        byte = temp * byte_block;

    return byte;
}

int main(int argc, char **argv)
{
    if (argc > 1)
        printf ("%lld\n", unit_parse (argv[1]));
}
时间: 2024-11-10 08:30:27

以下代码将字符串形式的尺寸描述转换成字节数的相关文章

以下代码将字节数转换成字符串形式的尺寸描述

#include <stdio.h> #include <stdlib.h> #include <string.h> #define SECTOR_SIZE_DEFAULT 512LL #define KILOBYTE_SIZE 1000LL #define MEGABYTE_SIZE 1000000LL #define GIGABYTE_SIZE 1000000000LL #define TERABYTE_SIZE 1000000000000LL #define KI

c语言代码编程题汇总:将字符串中的大写字母转换成小写字母

将字符串中的大写字母转换成小写字母 程序代码如下: 1 /* 2 2017年3月8日21:21:46 3 功能:将字符串中的大写字母转换成小写字母 4 */ 5 /* 6 #include"stdio.h" 7 8 int main() 9 { 10 int n = 0; 11 12 char a[100]; 13 14 printf("please input a string:"); 15 16 gets(a); 17 18 for(int i = 0 ;a[i

java中获取当前系统时间,并与字符串相互转换格式,或者转化成秒数,天数等整数

转换成秒数 Date类有一个getTime()可以换回秒数,例如: public class DateToSecond { public static void main(String[] args) { Date date = new Date(System.currentTimeMillis()); System.out.println(date.getTime()); } } 与字符串格式相互转换 一. 获取当前系统时间和日期并格式化输出: import java.util.Date; i

JavaSE8基础 String getBytes 将不含中文的字符串转换成字节数组

os :windows7 x64    jdk:jdk-8u131-windows-x64    ide:Eclipse Oxygen Release (4.7.0)        code: package jizuiku.t01; import java.nio.charset.Charset; public class Demo01 { public static void main(String[] args) { String str = "[email protected]#$&qu

利用正则表达式将字符串“2014-09-29 14:35:36” 转换成“20140929143536”

package cn.usst.DataTest4; public class DataTest4 { /** * 将字符串"2014-09-29 14:35:36" 转换成"20140929143536" * @param args */ public static void main(String[] args) { String str = "2014-09-29 14:35:36"; String str2 = "";

Linux c字符串中不可打印字符转换成16进制

本文由 www.169it.com 搜集整理 如果一个C字符串中同时包含可打印和不可打印的字符,如果想将这个字符串写入文件,同时方便打开文件查看或者在控制台中打印出来不会出现乱码,那么可以将字符串中的不可打印字符转换成16进制,此处提供一个函数供使用: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 void printhex(unsigned char *src,int len) {     

JS字符串去替换元素再转换成数组

原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11648074.html JS字符串替换不必要的元素, 然后去除多余的空格, 转换成数组: var padding = '1px 2px 3px 4px'; //去除所有的px,如果不加/g那么只会去除第一个px var paddingNew = padding.replace(/px/g, ""); var strArr = new Array(); //将一个或多个空格转换成一个

将xml字符串的所有叶标签转换成Map集合

实际问题:对方服务器接口采用webservice方式返回xml报文,现需解析xml获取所有叶节点的标签名及携带的值 解决方案:利用dom4j解析xml并利用递归获取叶节点,将标签名及标签值封装到Map集合供业务调用 import java.util.HashMap; import java.util.List; import java.util.Map; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.

使用JSONKit将字符串,字典,数组转换成json格式

NSString *str = nil; //字符串     NSMutableString *string = [[NSMutableString alloc] init];     [string appendString:@"xxxx"];     str = [string JSONString];     NSLog(@"str1:%@",[NSString stringWithString:str]);               //数组     NS