Mar 24, 2010 12:03
А точнее говоря, перевод размера в байтов в human readable величину в килобайтах, мегабайтах и т.д. Я понимаю что это очень просто но может кому пригодится :)
Основной код:
#include
#define BINARY_THOUSAND 1024
typedef enum {
SizeUnitBytes = 0,
SizeUnitKBytes = 1,
SizeUnitMBytes = 2,
SizeUnitGBytes = 3,
SizeUnitTBytes = 4,
SizeUnitPBytes = 5,
SizeUnitEBytes = 6,
SizeUnitZBytes = 7,
SizeUnitYBytes = 8
} SizeUnit;
typedef struct FileSize {
SizeUnit unit;
// Union of either size in bytes or size it KBytes, MBytes etc.
union {
double size;
long long sizeInBytes;
} value;
} FileSize;
FileSize NormalizeSize(long long size)
{
FileSize result = {0};
result.unit = size == 0 ? SizeUnitBytes : floor(log(size) / log(BINARY_THOUSAND));
if (result.unit == SizeUnitBytes) {
result.value.sizeInBytes = size;
} else {
result.value.size = size / pow(BINARY_THOUSAND, floor(result.unit));
}
return result;
}
Использовать можно так:
#include
static char *sizes[] = {
"bytes",
"Kb",
"Mb",
"Gb",
"Tb",
"Pb",
"Eb",
"Zb",
"Yb"
};
void PrintSize(long long size size)
{
FileSize normalized = NormalizeSize(size);
printf(normalized.unit ? "%.2f %s (%lld %s)" : "%lld %s",
normalized.value, sizes[normalized.unit], size, sizes[SizeUnitBytes]);
}
Если размер меньше 1024 байт, будет выведен размер в байтах, если больше, то в килобайтах, мегабайтах и т.д. при этом в скобках будет выведен размер в байтах
Си