首页 > 代码库 > 以下代码将字节数转换成字符串形式的尺寸描述
以下代码将字节数转换成字符串形式的尺寸描述
#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 1099511627776LLtypedef 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;}
以下代码将字节数转换成字符串形式的尺寸描述
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。