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

#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 KIBIBYTE_SIZE 1024LL
#define MEBIBYTE_SIZE 1048576LL
#define GIBIBYTE_SIZE 1073741824LL
#define TEBIBYTE_SIZE 1099511627776LL

typedef enum
{
    BASE_BINARY,
    BASE_DECIMAL
} Base;

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;

char *
unit_format_custom (long long n, DigitUnit unit)
{
    char *str = malloc(64);
    memset (str, 0, 64);
    float f;
    int len;
    char *suffix;

    switch (unit)
    {
    case DIGIT_UNIT_BYTE:
    {
        sprintf (str, "%lld%s", n, "B");
        break;
    }
    case DIGIT_UNIT_KILOBYTE:
    {
        f = (float) n / KILOBYTE_SIZE;
        sprintf (str, "%.1f", f);
        len = strlen(str);
        suffix = (*(str + (len - 1)) == ‘0‘) ? str + len - 2 : str + len;
        memset (suffix, 0, 2);
        sprintf (suffix, "%s", "K");
        break;
    }
    case DIGIT_UNIT_MEGABYTE:
    {
        f = (float) n / MEGABYTE_SIZE;
        sprintf (str, "%.1f", f);
        len = strlen(str);
        suffix = (*(str + (len - 1)) == ‘0‘) ? str + len - 2 : str + len;
        memset (suffix, 0, 2);
        sprintf (suffix, "%s", "M");
        break;
    }
    case DIGIT_UNIT_GIGABYTE:
    {
        f = (float) n / GIGABYTE_SIZE;
        sprintf (str, "%.1f", f);
        len = strlen(str);
        suffix = (*(str + (len - 1)) == ‘0‘) ? str + len - 2 : str + len;
        memset (suffix, 0, 2);
        sprintf (suffix, "%s", "G");
        break;
    }
    case DIGIT_UNIT_TERABYTE:
    {
        f = (float) n / TERABYTE_SIZE;
        sprintf (str, "%.1f", f);
        len = strlen(str);
        suffix = (*(str + (len - 1)) == ‘0‘) ? str + len - 2 : str + len;
        memset (suffix, 0, 2);
        sprintf (suffix, "%s", "T");
        break;
    }
    case DIGIT_UNIT_KIBIBYTE:
    {
        f = (float) n / KIBIBYTE_SIZE;
        sprintf (str, "%.1f", f);
        len = strlen(str);
        suffix = (*(str + (len - 1)) == ‘0‘) ? str + len - 2 : str + len;
        memset (suffix, 0, 2);
        sprintf (suffix, "%s", "Ki");
        break;
    }
    case DIGIT_UNIT_MEBIBYTE:
    {
        f = (float) n / MEBIBYTE_SIZE;
        sprintf (str, "%.1f", f);
        len = strlen(str);
        suffix = (*(str + (len - 1)) == ‘0‘) ? str + len - 2 : str + len;
        memset (suffix, 0, 2);
        sprintf (suffix, "%s", "Mi");
        break;
    }
    case DIGIT_UNIT_GIBIBYTE:
    {
        f = (float) n / GIBIBYTE_SIZE;
        sprintf (str, "%.1f", f);
        len = strlen(str);
        suffix = (*(str + (len - 1)) == ‘0‘) ? str + len - 2 : str + len;
        memset (suffix, 0, 2);
        sprintf (suffix, "%s", "Gi");
        break;
    }
    case DIGIT_UNIT_TEBIBYTE:
    {
        f = (float) n / TEBIBYTE_SIZE;
        sprintf (str, "%.1f", f);
        len = strlen(str);
        suffix = (*(str + (len - 1)) == ‘0‘) ? str + len - 2 : str + len;
        memset (suffix, 0, 2);
        sprintf (suffix, "%s", "Ti");
        break;
    }
    }

    return str;
}

static char *
unit_format (long long n, Base base)
{
    DigitUnit unit = DIGIT_UNIT_BYTE - 1;
    long long tmp = n;

    if (base == BASE_DECIMAL)
    {
        while (tmp > 0)
        {
            tmp /= 1000;
            unit++;
        }
    }
    else if (base == BASE_BINARY)
    {
        while (tmp > 0)
        {
            tmp /= 1024;
            unit++;
            if (unit == DIGIT_UNIT_KILOBYTE)
            {
                unit = DIGIT_UNIT_KIBIBYTE;
            }
        }
    }

    return unit_format_custom (n, unit);
}

int main(int argc, char **argv)
{
    printf ("%s\n", unit_format_custom (25678, DIGIT_UNIT_KILOBYTE));
    printf ("%s\n", unit_format (4096, BASE_BINARY));
    printf ("%s\n", unit_format (4096, BASE_DECIMAL));
    printf ("%s\n", unit_format (8192, BASE_BINARY));
    printf ("%s\n", unit_format (8192, BASE_DECIMAL));
    return 0;
}
时间: 2024-10-29 04:18:34

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

C#字节数组转换成字符串

C#字节数组转换成字符串 如果还想从 System.String 类中找到方法进行字符串和字节数组之间的转换,恐怕你会失望了.为了进行这样的转换,我们不得不借助另一个类:System.Text.Encoding.该类提供了 bye[] GetBytes(string) 方法将字符串转换成字节数组,还提供了 string GetString(byte[]) 方法将C#字节数组转换成字符串. System.Text.Encoding 类似乎没有可用的构造函数,但我们可以找到几个默认的 Encodin

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

#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 #

数字按照不同格式转换成字符串

如果自己写函数,不使用itoa怎么判断呢? 我们用通常的办法,对数字进行每位的除商,得到后与字符'0'相加. flag = 0; for(i=0;i<6;i++){ tmp = int(num/pow(10,5-i)); if(tmp != 0){ *str = 1; flag = 1; } if(*str != 0 || flag){ *str++ = tmp+'0'; num = num%int(pow(10,5-i)); } } 要注意的就是,我们设置标志位flag,为1之前的所有0都不输

怎样把php数组转换成字符串,php implode()

实例代码 一维数组转换成字符串代码! <?php $arr1=array("shu","zhu","1"); $c=implode("##",$arr1); echo $c;  //shu##zhu##1 ?> 二维数组转换成字符串代码 <?php $arr=array(array("hu","peng","123456")); $b=implode

将整数n转换成字符串的方法

最近做一个题,用递归方法将整数n转换成为字符串,做了半天做好了才发现有一个库函数直接就可以实现这个功能,真是日了狗了.... 小二,上代码... #include<stdio.h> #include<stdlib.h> #include<string.h> //  这个turnover函数是为了将字符串调转过来,因为convert函数中将n转换成字符串后字符串是倒着的 //  就是利用了一个中间变量将字符串数组s首尾依次交换 char *turnover(char *s

json字符串转换成json对象,json对象转换成字符串,值转换成字符串,字符串转成值

主要内容: 一.json相关概念 二.json字符串转换成json对象 (字符串-->JSON对象) 三.json对象转换成字符串(json对象-->字符串) 四.将值转换成字符串(值-->字符串) 五.字符串转成值(字符串-->值) 同步的交流学习社区:http://www.mwcxs.top/page/425.html 一.json相关概念 json,全称为javascript object notation,是一种轻量级的数据交互格式.采用完全独立于语言的文本格式,是一种理想

谭浩强 c程序设计 8.17用递归法将一个整数n转换成字符串。例如,输入486,应输出字符串&quot;486&quot;。n的位数不确定,可以是任意位数的整数。

8.17用递归法将一个整数n转换成字符串.例如,输入486,应输出字符串"486".n的位数不确定,可以是任意位数的整数. #include <stdio.h> char str1[20];int i=0;long n;int main(){        int longToStr(long n);    char *revstr(char *str, int len);    printf("请输入一个整数n:\n");    scanf("

将整形数字(int)转换成字符串

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> #include<string.h> void itoa(int n, char *buf) { int count = 0; char nu; char buf2[128] = { 0 }; //核心算法很简单 就是每次取出各位数字然后把数字转存进数组,中间有一个数组匿置的过程 do

浮点数转换成字符串函数

sprintf函数太大,在STM8上面根本不敢用,动不动就.text overflow.为了将采集的数值通过串口上传到计算机,只能自己写了一个浮点数转换成字符串的函数: #include <stdio.h> #include <stdint.h> static char table[]={'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}; void num2char(char *str, double number, uint8_t